Ja kann man annehmen. Allerdings muß der Programmierer dieser Sofwtare nicht schuld sein. Dh. er hat sich zb. an die MS Spezifikationen der Hooks gehalten und erst im Zusammenhang mit noch anderen
DLL/Prozessen/Treibern entsteht dieses Problem.
Frage: das Wnd ist ein Fensterhandle aus deiner Anwendung ? Falls ja ist definitiv was falsch. Falls nein so besteht die Möglichkeit das du mit dem Aufruf von SendMessage() an ein Fensterhandle eines anderen Prozesses einen Fehler machst.
Dazu muß man weiter ausholen: Microsoft empfiehlt bei "Interprozesskommunikation" SendMessage() nicht zu benutzen. Falls Wnd aus einem anderen Prozess stammt dann ist dies eine Interprozesskommunikation. SendMessage() kehrt per Definition erst dann zurück wenn der Fensterhandler -> WndProc des empfangenden Fensters auzurückkehrt. In dieser Zeitspanne blockiert SendMesage() unseren Prozess, bzw. genau gesagt unseren Messagequeue. Nun hookt sich das Fremdprogram überall dazwischen. Bei jeder Nachricht informiert der globale Hook dieses Programmes seinen eigenen Kernel. Also alle Nachrichten aller Fenstern im System werden abgefangen und wahrscheinlich informieren die "Hooks" ihren Mutterprozess. Dieser reagiert nun seinerseits darauf indem er zb. wm_GetText des aktiven Fensters unserer Applikation aufrufen möchte. Das macht er per SendMessage(). Da unser Prozess immer noch in seiner SendMessage() ist die intern im System gerade im Hook ist, der seinen Mutterprozess ebenfalls per SendMessage() informiert, der daraufhin selber mit SendMesages() eines unsere Fenster ansprechen möchte, das aber in der eigenen SendMessage() noch hängt, haben wie einen typischen Deadlock.
Das passierte weil zwei Programierer einen Denbkfehler gemacht haben.
1.) der Entwickler von PixelRuler benutzt SendMessage() für Interprozesskommunikation obwohl er SendMessageTimeOut() benutzen müsste
2.) der Entwickler deines Programmes, also DU, benutzt SendMessage() für Interprozesskommunikation obwohl er SendMessageTimeOut() benutzen müsste
Einer von beiden MUSS SendMessageTimeout() benutzen damit dieser Deadlock beseitigt wird. Normalerweise derjenige der den Hook implementiert, meine ich, aber ich persönlich würde denoch an deiner Stelle nie SendMessage() benutzen, einfach um sicherzugehen.
Oben schrieb ich "informieren die Hooks ihren Mutterprozess". Einen globalen systemweiten Hook gibt es im Grunde garnicht, das ist in einem Protected Mode
OS garnicht möglich (mal abgesehen von Kernelhooks sprich auf Ring 0 in Treibern). Ein globaler Hook besteht nämlich aus X prozesslokalen Hook-kopien die jede für sich gesehen in den Addressraum aller betroffenen Prozesse im gesammten System injeziert werden (durch das
OS selber). Das bedeutet das die Hookprocedure der Hook-
DLL quasi 1 gemeinsammes Codesegment für alle Prozesse benutzt aber X verschiedene eigene Datensegemente, für jeden gehookten Prozess, ein eigenes. Dies führt nun dazu das der Hookprogramierer mit seinem Mutterprozess kommunizieren muß. Man benötigt eine Interprozesskommunikation. Naiv betrachtet benutzt ein unerfahrerener Programmierer nun die SendMessage() Funktion um eigene Steuernachrichten aus dem Hook heraus an seinen Mutterprozess zu senden.
So das wäre EIN Szenario. Ein weiteres ist es das Wnd garkein gültiges Fensterhandle mehr enthält. Hm, SendMessage() müsste eigentlich daraufhin sofort zurückkehren. Allerdings wenn Wnd ein Fensterhandle enthält das zwar noch gültig aber tot ist, sprich blockiert, deadsubclassed etc.pp. dann kann SendMessage() dieses nicht erkennen. Sie ruft die WndProc dieses Fensters auf und diese Callback kehrt nie zurück oder der Aufruf landet im Nirvana.
Aber auch hier hilft SendMessageTimeout().
Gruß Hagen