Das Programm besteht aus einer
DLL - unbedingt nötig für den Hook - und dem Hauptprogramm mit der Schleife. Das Hauptprogramm sieht dann ungefähr so aus:
Delphi-Quellcode:
procedure Proc;
begin
HookInstallieren(Application.Handle);
repeat
ResetDLL; //Variable "FehlerErschienen" auf False setzen
TryEnterRoom;
Delay(10); //Verringert CPU-Auslastung und gibt dem anderen Programm die Möglichkeit, die Fehlermeldung anzuzeigen
if not FehlerErschienen then //Erfolg
break;
FehlermeldungWegKlicken;
until getkeystate(VK_ESCAPE); //nötig für nutzerseitigen Abbruch
HookDeinstallieren;
end;
Die
DLL muss folglich die Funktionen HookInstallieren, Hookdeinstallieren, ResetDLL und Fehlererschienen exportieren. Die letzten beiden Funktionen brauchen wir, da DLLs keine Variablen exportieren können, wir müssen den Zugriff daher kapseln.
Große Teile dieses Hooks stammen aus Assarbads Tutorial
hier, ich habe dann einfach verwiesen.
In der
DLL steht ungefähr folgender Code:
Delphi-Quellcode:
var Fehler:boolean;
HookHandle: cardinal=0;
//Siehe Assarbads Tutorial
WindowHandle:cardinal=0;
//Siehe Assarbads Tutorial
function MyHookFunc(nCode: integer; wParam: wparam; lParam: lparam):LRESULT;
stdcall;
var Buf:
array[0..255]
of char;
//Fenstertext-Puffer
begin
if nCode=HCBT_CREATEWND
then //geht es um Erstellung eines Fensters?
begin
sendmessage(wParam,
//Handle des neuen Fensters
WM_GETTEXT,
//Wir wollen den Fenstertext
255,
//Die Länge des Puffers
integer(@buf[0]));
//Zeiger auf das erste Zeichen im Puffer
if Buf='
Inhalt der Fehlermeldung'
//Ist dies das gesuchte Fehlermeldungsfenster?
Fehler:=true;
end;
CallNextHookEx(HookHandle, nCode, wParam, lParam);
//in jedem Fall Callnexthookex aufrufen!
end;
procedure resetDLL;
//Kapselung von Variablenzugriff
begin
Fehler:=false;
end;
function Fehlererschienen:boolean;
//ebenso
begin
result:=Fehler;
end;
function Hookinstallieren(Hwnd: Cardinal): Boolean;
//Siehe Assarbads Tutorial; aber den richtigen Hook-Typ (WH_CBT) verwenden!
function HookDeinstallieren:boolean;
//Siehe Assarbads Tutorial
Bei weiteren Fragen entweder hier im Forum oder im Chat.
Grüße
Apollonius