library wmsgcatch;
uses
Windows,
Messages;
const
mymsg='
HNOTICERS';
var
HookHandle:Cardinal;
TargetWindowHandle:Cardinal;
OwnWindowHandle:Cardinal;
WM_HNOTICE1 : Cardinal = 0;
function GetMsgProc(code: integer; wParam: WPARAM; lParam: LPARAM): LResult;
stdcall;
begin
WM_HNOTICE1:=RegisterWindowMessage(mymsg);
//Damit zu Testzwecken dem Hauptprogramm eine Nachricht geschickt werden kann
setprop(OwnWindowHandle,mymsg,WM_HNOTICE1);
//WM_HNOTICE1 übergeben
with Windows.PMsg(lParam)^
do begin
if ((
message = WM_CLOSE)
or(message=WM_QUERYENDSESSION)
or(message=WM_MOUSEMOVE))
then begin //WM_MOUSEMOVE habe ich nur drin, um zu testen, ob das Hauptprogramm überhaupt benachrichtigt wird
SendMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
//Das Hauptprogramm benachrichtigen
PostMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
// Ich verwende sowohl SendMessage als auch PostMessage, um auszuschließen, dass es mit einer der beiden Funktionen Probleme gibt
if (hwnd=TargetWindowHandle)
then begin //Wenn es sich um Das Handle des zu 'schützenden' Fensters handelt
SendMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
PostMessage(HWND_Broadcast, WM_HNOTICE1, wParam, lParam);
pmsg(lparam).
message:=WM_NULL;
//Nachricht abbrechen
end;
end;
end;
Result := CallNextHookEx(HookHandle, Code, wparam, lparam);
end;
function InstallHooks(Hwnd: Cardinal;OwnHwnd:Cardinal): Boolean;
stdcall;
begin
TargetWindowHandle:=Hwnd;
//Handle des zu schützenden Fensters
OwnWindowHandle:=OwnHwnd;
//Handle des Hauptprogramm-Fensters
HookHandle := SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstance,
{GetWindowThreadProcessId(TargetWindowHandle)}0);
//Verwende erst einmal 0
Result:=Hookhandle<>0;
end;
function UninstallHooks: Boolean;
stdcall;
begin
result:=UnHookWindowsHookEx(HookHandle);
end;
exports
InstallHooks,
UninstallHooks;
begin
end.