Показать сообщение отдельно
  #11  
Старый 26.12.2010, 16:51
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 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;
__________________
Помогаю за Спасибо
Ответить с цитированием