// 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.


Zugriffe seit 6.9.2001 auf Delphi-Ecke