Надо поставить хук на создание окон. Нашел (и слегка модифицировал) такой код:
var HookHandle: hHook;
function CBTProc(Code: integer; WParam: word; LParam: Integer): Longint; stdcall; type PCBT_CREATEWND=^CBT_CREATEWND; var s: pchar; z: PCBT_CREATEWND; ok: Integer; s2:string; i:byte; begin if Code<0 then begin Result := CallNextHookEx(HookHandle, code, WParam, LParam); exit; end; case Code of HCBT_CREATEWND: begin z:=PCBT_CREATEWND(LParam); s:=z.lpcs.lpszName; if s<>nil then begin s2:=''; for i:=1 to length(s) do begin s2:=s2+s^; inc(s); end; if pos('Блокнот',s2)>0 then begin Result:=1; exit; end; end; end; end; Result := 0; end;
begin HookHandle := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0); end;
Я сделал перевод из pchar в string, до этого там была какая-то жутко тупая проверка, которая почему-то работала. Этот код, как я понял, распространяется только на моё приложение. hookhandle>=0.
Сообщение отредактировано: Unconnected -
--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
function GetClName(myWnd: HWND): String; var Cl: array[0 .. pred(MAX_PATH)] of char; begin GetClassName(myWnd, Cl, MAX_PATH); result := cl; end;
function CBTProc(Code: integer; myWParam: WPARAM; myLParam: LPARAM): LRESULT; stdcall; begin if Code < 0 then begin Result := CallNextHookEx(RHookRec^.HookID, code, myWParam, myLParam); exit; end;
case Code of HCBT_CREATEWND: begin if pos('NOTEPAD', UpperCase(GetClName(myWParam))) > 0 then begin PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0); result := 1; Exit; end; end; end; result := 0; end;
{$J+} procedure EntryPointProc(Reason: Integer); const hMapObject: THandle = 0; begin case reason of DLL_PROCESS_ATTACH: begin hMapObject := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(THookRec), 'volvo_CBT'); rHookRec := MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookRec)); end;
DLL_PROCESS_DETACH: begin UnMapViewOfFile(rHookRec); CloseHandle(hMapObject); end;
DLL_THREAD_ATTACH, DLL_THREAD_DETACH: ; end; end;
exports SetTheHook, DelTheHook;
begin DllProc := @EntryPointProc; EntryPointProc(DLL_PROCESS_ATTACH); end.
Сколько кода добавлено? 10 строк? Если что - вот VCL-ный проект, который ставит хук и получает сообщение о том, что окно было заблокировано (проект с DLL-кой тоже вложен): hook_test.zip ( 73.85 килобайт )
Кол-во скачиваний: 447