Hallo,
ich habe mir mittels Hooks eine kleine Hilfskomponente gebastelt, welche mir zur Laufzeit ein par Eigenschaften zu meinen Controls anzeigt und ggf. ändert. Einige Funktionen habe ich in das Systemmenü meines Programms eingebunden. Nun wüsste ich gerne wann diese ausgewählt/angeklickt werden.
So:
Delphi-Quellcode:
const
MeinMenuItem = 4711;
procedure WMSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
inherited;
if (Msg.wParam shr 16) = 0 then
begin
case Word(Msg.wParam) of
MeinMenuItem: MessageBox(0, 'MeinItem', '', 0);
SC_MINIMIZE: MessageBox(0, 'Minimize', '', 0);
end;
end;
end;
...funktioniert alles, immer wunderbar. Auch mit meinen eigenen MenuItems. Ich möchte aber meine Programme nicht anpassen müssen und habe deshalb in meiner Komponente ein WH_CALLWNDPROC-Hook eingebaut:
Delphi-Quellcode:
...
wndHook := SetWindowsHookEx(WH_CALLWNDPROC, @WndProc, 0, GetCurrentThreadId);
...
function WndProc(nCode : Integer; wParam: longint; lParam : longint): LRESULT; stdcall;
var
cwps: TCWPStruct;
begin
if (nCode = HC_ACTION) then
begin
CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT));
case cwps.message of
WM_SYSCOMMAND:
begin
if (cwps.wParam shr 16) = 0 then
begin
case Word(cwps.wParam) of
MeinMenuItem: MessageBox(0, 'MeinItem', '', 0);
SC_MINIMIZE: MessageBox(0, 'Minimize', '', 0);
end;
end;
end;
end;
end;
Result := CallNextHookEx(wndHook, nCode, wParam, lParam);
end;
Das funktioniert nur mit "Minimieren" aber bei meinen eigenen Items erhalte ich keine Botschaft (zumindest kein WM_SYSCOMMAND).
Das funktioniert nicht immer. Wähle ich jetzt im Menü "Minimieren" wird das Programm minimiert aber ich erhalte keine Botschaft (zumindest kein WM_SYSCOMMAND). Klicke ich im Titel auf den entsprechenden Button, greift mein Hook.
Hat jemand eine Idee woran das liegen könnte oder ob es Alternativen für mich gibt? Bisher nur auf einem Vista32 ausprobiert... Im Netz findet man ja einige unterschiedliche Ansätze um den Hook zu implementieren. Bei allen hatte ich das gleiche Verhalten.
EDIT:
Hatte Unsinn im Quelltext, daher habe ich die Problemschilderung korrigiert..