// Es bestand die
Aufgabe festzustellen, wann mit der Maus auf eine freie Stelle
// des Desktops geklickt wurde. Somit war zunächst klar, dass das Ganze
über
// einen Mousehook laufen muss, welcher sich in einer DLL befindet.
Dummerweise
// war aber das Ergebnis beim Klick auf eine freie Stelle haargenau das
Gleiche,
// wie bei einem Klick auf eine Verknüpfung (Icon). Nach einigem
Probieren
// fand ich dann die folgende Lösung:
// Getestet mit D4 unter XP
library Test;
uses
windows,
commctrl,
messages;
const
mausHook: Hhook = 0;
var
desk: THandle;
tst: LV_HITTESTINFO;
function mausProc(HookCode: Integer; WParam: WPARAM;
LParam: LPARAM): LRESULT; stdcall;
begin
if (HookCode = HC_ACTION) and (WParam = WM_LBUTTONUP) and
(PMOUSEHOOKSTRUCT(LParam)^.hwnd = desk) then begin
tst.pt := PMOUSEHOOKSTRUCT(LParam)^.pt;
if ListView_HitTest(desk, tst) < 0 then begin
// hier ist eine freie Stelle auf dem Desktop,
// also mach was, z.B.:
messagebeep(0);
end;
end;
result := CallNextHookEx(MausHook, HookCode, WParam, LParam);
end;
procedure HookInst;
begin
if MausHook <> 0 then exit;
MausHook := SetWindowsHookEx(WH_MOUSE, mausProc, HInstance, 0);
if MausHook = 0 then
MessageBox(0, 'Hook wurde nicht installiert.', 'FEHLER', MB_ICONERROR);
end;
procedure HookUninst;
begin
if MausHook <> 0 then UnhookWindowsHookEx(MausHook);
end;
exports HookInst, HookUninst;
begin
desk := getwindow(getwindow(findwindow('ProgMan', nil), gw_child), gw_child);
zeromemory(@tst, sizeof(tst));
end.
|