Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Fehlermeldung von fremdem Programm abfragen

  Alt 15. Aug 2007, 12:21
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat