Einzelnen Beitrag anzeigen

bepe

Registriert seit: 17. Okt 2006
118 Beiträge
 
#1

WH_CALLWNDPROC-Hook // SystemMenu-Items

  Alt 12. Apr 2008, 10:29
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..

mfg,
bp
  Mit Zitat antworten Zitat