AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WH_CALLWNDPROC-Hook // SystemMenu-Items
Thema durchsuchen
Ansicht
Themen-Optionen

WH_CALLWNDPROC-Hook // SystemMenu-Items

Ein Thema von bepe · begonnen am 12. Apr 2008 · letzter Beitrag vom 12. Apr 2008
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz