Fórum Por que minha Hook de monitoração de mensagens não funciona! #229094
30/04/2004
0
library HookMonitor; uses Windows, SysUtils, Messages; const HOOK_INSTALLED_FAILED=0; HOOK_INSTALLED_OK=1; HOOK_ALREADY_INSTALLED=2; HOOK_UNINSTALLED_FAILED=0; HOOK_UNINSTALLED_OK=1; HOOK_NOT_INSTALLED=2; MAX_TYPES = 11; var HookHandle: HHOOK; FileHandle: TextFile; HookInstalled: boolean; HookTypesCode: array [0..MAX_TYPES] of integer = (WH_CALLWNDPROC, WH_CALLWNDPROCRET, WH_CBT, WH_DEBUG, WH_GETMESSAGE, WH_JOURNALPLAYBACK, WH_JOURNALRECORD, WH_KEYBOARD, WH_MOUSE, WH_MSGFILTER, WH_SHELL, WH_SYSMSGFILTER); HookTypesStr: array [0..MAX_TYPES] of PChar = (´WH_CALLWNDPROC´, ´WH_CALLWNDPROCRET´, ´WH_CBT´, ´WH_DEBUG´, ´WH_GETMESSAGE´, ´WH_JOURNALPLAYBACK´, ´WH_JOURNALRECORD´, ´WH_KEYBOARD´, ´WH_MOUSE´, ´WH_MSGFILTER´, ´WH_SHELL´, ´WH_SYSMSGFILTER´); function FindHookType(HookType: integer): integer; var i: integer; begin Result := -1; for i := 0 to MAX_TYPES do begin if(HookTypesCode[i] = HookType)then begin Result := i; break; end; end; end; function DebugProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; var HookTypeIndex: integer; begin HookTypeIndex := FindHookType(wParam); if(HookTypeIndex >= 0)then WriteLn(FileHandle, TimeToStr(Time) + ´ ´ + HookTypesStr[HookTypeIndex]); Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); end; function InstallHook: integer; begin if(HookInstalled)then Result := HOOK_ALREADY_INSTALLED else begin HookHandle := SetWindowsHookEx(WH_DEBUG, @DebugProc, HInstance, 0); if(HookHandle <> 0)then begin HookInstalled := True; AssignFile(FileHandle, ´log.txt´); Rewrite(FileHandle); Result := HOOK_INSTALLED_OK; end else Result := HOOK_INSTALLED_FAILED; end; end; function UninstallHook: integer; begin if(HookInstalled)then begin Result := Ord(UnHookWindowsHookEx(HookHandle)); if(Result = HOOK_UNINSTALLED_OK)then begin HookInstalled := False; CloseFile(FileHandle); end; end else Result := HOOK_NOT_INSTALLED; end; function IsHookInstalled: boolean; begin Result := HookInstalled; end; exports InstallHook, UninstallHook, IsHookInstalled; begin HookInstalled := False; end.
Quando eu chamo o InstallHook o retorno de SetWindowsHookEx diz que a hook foi instalada com sucesso no entanto quando se chama o UnHookWindowsHookEx ele não acha mais a hook sem contar que nada é gravado no arquivo de log. Alguem sabe qual o problema neste código?
Maxwell_monteiro
Curtir tópico
+ 0Posts
30/04/2004
Nildo
AssignFile(FileHandle, ´log.txt´);
Talvez ele esteja criando em um outro local...
AssignFile(FileHandle, ´[b:90083de436]c:\[/b:90083de436]log.txt´);
Tenta colocar assim.
Outra coisa Você vai precisar usar um TRtlCriticalSection para usar o Log. Pois e se duas coisas acontecerem ao mesmo tempo? Vai dar pau no arquivo. O CriticalSection não deixa isso acontecer, enquanto uma thread estiver executando o que esta dentro de um CriticalSection, a outra fica no aguardo até que esta termine. É só uma dica, não é algo que vai fazer funcionar seu programa.
Gostei + 0
30/04/2004
Nildo
Gostei + 0
30/04/2004
Maxwell_monteiro
Gostei + 0
30/04/2004
Nildo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)