
26.12.2010, 16:51
|
 |
Продвинутый
|
|
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
|
|
Делай хук на ThreadID, соответственно все окна, видимые и не видимые будут отлавливаться... кстати, если читать справку по функции SetWindowsHookEx, то там сказано, что функция должна находиться в библиотеке.
Вот пример задания хука для приложения:
Код:
//библиотека
library Hook;
uses Windows, SysUtils;
const
crlf = #$0D#$0A;
Var
logfile : string = 'D:\log.txt';
Hook : dword;
dwThreadId : dword;
cFile : dword;
Function kWriteFile(
hFile:THANDLE;
lpBuffer:Pointer;
nNumberOfBytesToWrite:DWORD ;
lpNumberOfBytesWritten:LPDWORD;
lpOverlapped:pointer ):boolean; stdcall; external 'kernel32.dll' name 'WriteFile';
Function kReadFile(
hFile:THANDLE;
lpBuffer:Pointer;
nNumberOfBytesToRead:DWORD ;
lpNumberOfBytesReaden:LPDWORD;
lpOverlapped:pointer ):boolean; stdcall; external 'kernel32.dll' name 'ReadFile';
Function FindWnd (pWndCaption: PChar) : boolean;
var
w : dword;
begin
result := false;
w := FindWindow(nil,pWndCaption);
if w = 0 then exit;
dwThreadID := GetWindowThreadProcessId(w,nil);
if dwThreadId <> 0 then result := true;
end;
procedure LibraryProc(Reason: Integer);
begin
if (Reason = DLL_PROCESS_ATTACH) or (Reason = DLL_THREAD_ATTACH) then
begin
cFile := CreateFile(PChar(logfile),GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN,0);
end else CloseHandle(cFile);
end;
function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
var
written : dword;
cFileSizeLow,cFileSizeHi : integer;
sBuf : string;
begin
if code < 0 then result := CallNextHookEx(Hook,code,wParam,lparam) else
begin
cFileSizeLow := GetFileSize(cFile,@cFileSizeHi);
SetFilePointer(cFile,cFileSizeLow,@cFileSizeHi,FILE_BEGIN );
sBuf := ParamStr(0)+': code = '+IntToStr(code)+' wparam = '+IntToStr(wParam)+' lparam = '+IntToStr(lParam)+crlf;
kWriteFile(cFile,PChar(sbuf),length(sBuf),@written,nil);
Result:=0;
end;
end;
Function InstallHook (pWndCaption: PChar): boolean;
begin
result := false;
if not(FindWnd(pWndCaption)) then exit;
if not(ForceDirectories(ExtractFilePath(logfile))) then exit;
Hook := SetWindowsHookEx(WH_CBT,@CbtProc,HInstance,dwThreadId);
result := Hook <> 0;
end;
Function UnInstallHook: boolean;
begin
result := false;
CloseHandle(cFile);
if Hook <> 0 then result := UnhookWindowsHookEx(Hook);
end;
exports
InstallHook name 'InstallHook',UnInstallHook name 'UnInstallHook';
begin
DLLProc := LibraryProc;
end.
Код:
// и сама программа
...
Function InstallHook (pWndCaption: PChar): boolean; external 'Hook.dll';
Function UnInstallHook: boolean; external 'Hook.dll';
...
procedure TForm1.Button1Click(Sender: TObject);
begin
if InstallHook('Блокнот') then ShowMessage('Installed');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if UnInstallHook then ShowMessage('Uninstalled');
end;
__________________
Помогаю за Спасибо
|