Hooks



  • Hallo,
    ich arbeite hier grade mit meinem Buch ein Kapitel mit Hooks durch. Die Hooks scheinen sehr interessant zu sein. Leider ist in diesem Buch alles schlecht erklärt und deshalb wollte ich mal fragen ob jemand eventuell gute Seiten kennt wo hooks beschrieben werden. Hab bei google schon gesucht, aber leider nix passendes gefunden...



  • Huhu,

    ein Howto für Systemweite hooks findest du hier - http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5685/

    Dann steht auch im buch von Dirk Louis was dazu - http://www.amazon.de/exec/obidos/ASIN/3827267749/qid=1088717590/ref=sr_8_xs_ap_i11_xgl14/302-7015883-2159225

    Ansonsten kann ich nur Google empfehlen 😞

    Mfg

    Disi



  • Disi schrieb:

    Huhu,

    ein Howto für Systemweite hooks findest du hier - http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5685/

    Dann steht auch im buch von Dirk Louis was dazu - http://www.amazon.de/exec/obidos/ASIN/3827267749/qid=1088717590/ref=sr_8_xs_ap_i11_xgl14/302-7015883-2159225

    Ansonsten kann ich nur Google empfehlen 😞

    Mfg

    Disi

    In dem Buch steht leider nicht sehr viel zu dem Thema Hooks und bei google bekomme ich irgendwie keine gescheiten ergebnisse... 😞



  • Die Funktion

    SetWindowHookEx
    

    installiert die Hook-Prozedur.
    Wenn Nachrichten nur für eine Anwendung gefiltert werden sollen, können die Filterfunktionen in dieser Anwendung untergebracht werden.
    Sollen die Nachrichten für alle Anwendungen gefiltert werden, muss die Filterfunktion in einer DLL abgelegt werden.
    Um einen Hook zu entfernen, wird die Funktion

    UnhookWindowsEx
    

    aufgerufen.

    HOOK ERZEUGEN:

    Syntax:

    HHOOK SetWindowsHookEx(int nFilterType,    // Filtertyp 
                           HOOKPROC hkprc,     // Hookprozedur
                           HINSTANCE hMod,     // Handle zur Instanz der Applikation
                           DWORD dwThreadID);  // Thread Identifikation
    
    SetWindowsHookEx
    

    installiert eine Nachrichtenfilterfunktion.
    Es gibt verschiedene Typen, die durch den Parameter nFilterType angegeben werden.
    Es können mehrere Filter gleichzeitig installiert sein, so dass eine Kette von Funktionen zur Nachrichtenverarbeitung entsteht.
    Hookfunktionen können Nachrichten beobachten, verarbeiten oder ändern, noch bevor diese an die Anwendung gesendet werden.
    Mit Hookfunktionen kann das Verhalten von Windows auf Systemebene verändert werden.

    Rückgabewert:

    HHOOK
    

    Bei erfolgreicher Ausführung wird der Handle der Hookprozedur zurückgegeben, sonst NULL.

    Parameter:

    Filtertypen:

    int nFilterType
    

    Der Filterfunktionstype und Nachrichtentype, die gefiltert werden sollen, bevor sie zur Anwendung gesendet werden.

    WH_CALLWNDPROC...............Überwacht Nachrichten, die mit SendMessage an eine Windowprozedur geschickt wurden.

    Syntax:

    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    Parameter:

    int nCode
    

    Gibt an, ob die Hookprozedur die message verarbeiten soll.
    Ist nCode HC_ACTION, muss der Hook die message verarbeiten.
    Ist nCode < 0 wird die message an CallNextHook weitergereicht,
    ohne sie weiter zu verarbeiten,
    dabei sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    WPARAM wParam
    

    Ungleich NULL, wenn die Message vom aktuellen Prozess gesendet wurde.

    LPARAM lParam
    

    Zeiger auf CWPSTRUCT-Struktur.
    Diese Struktur entält messagedetails.

    Die CWPSTRUCT Struktur:

    typedef struct tagCWPSTRUCT
    {
        LPARAM lParam,  // lParamWert der Message
        WPARAM wParam,  // wParamWert der Message
        DWORD  message, // message
        HWND   hwnd,    // windowhandle des empfängers
    } CWPSTRUCT;
    

    WH_CALLWNDPROCRET.........Überwacht Nachrichten, nachdem sie durch die Zielwindowsprozedur verarbeitet wurden.

    Syntax:

    LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    Parameter:

    int nCode
    

    Gibt an, ob die Hookprozedur die message verarbeiten soll.
    Ist nCode HC_ACTION, muss der Hook die message verarbeiten.
    Ist nCode < 0 wird die message an CallNextHook weitergereicht,
    ohne sie weiter zu verarbeiten,
    dabei sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    WPARAM wParam
    

    Ungleich NULL, wenn die Message vom aktuellen Prozess gesendet wurde.

    LPARAM lParam
    

    Zeiger auf CWPRETSTRUCT-Struktur.
    Diese Struktur enthält messagedetails.

    Die CWPRETSTRUCT-Struktur:

    typedef sturct tagCWPRETSTRUCT
    {
        LRESULT lResult,  // rückgabewert der windowsprozedure, die die nachricht message verarbeitet hat
        LPARAM lParam,    // zusatzinformation zur message, abhängig von message
        WPARAM wParam,    // zusatzinformation zur message, abhängig von message
        DWORD  message,   // message
        HWND   hWnd       // windowhandle, welches die nachricht verarbeitet hat
    } CWPRETSTRUCT;
    

    WH_CBT...................................Empfängt Benachrichtigungen, die für CBT nützlich sind.

    Syntax:

    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    HBCT_ACTIVATE
    HBCT_CREATEWND
    HBCT_DESTROYWND
    HBCT_MINMAX
    HBCT_MOVESIZE
    HBCT_SETFOCUS
    HBCT_SYSCOMMAND

    Parameter:

    int nCode
    

    Gibt an, ob die Hookprozedur die message verarbeiten soll.
    Ist nCode HC_ACTION, muss der Hook die message verarbeiten.
    Ist nCode < 0 wird die message an CallNextHook weitergereicht,
    ohne sie weiter zu verarbeiten,
    dabei sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    nCode Werte für WH_CBT:
    HCBT_ACTIVATE Ein Window wird gerate aktiviert.
    HCBT_CLICKSKIPPED Eine Mausnachricht wurde aus der Systemmessagequeue entfernt.
    HCBT_CREATEWND Ein Windowwird gerade aktiviert. CreateWindow schlägt fehlt, wenn der Rückgabewert != 0 ist.
    HCBT_DESTROYWND Ein Window wird gerade entfernt.
    HCBT_KEYSKIPPED Eine Keyboardmessage wurde aus der Systemmessagequeue entfernt.
    HCBT_MINMAX Ein Window wurde minimiert bzw. maximiert
    HCBT_MOVESIZE Ein Window wurde vergössert bzw. verkleinert.
    HCBT_QS Die Message WM_QUEUESYNC wurde von der Systemmessagequeue empfangen.
    HCBT_SETFOCUS Ein Window erhält gerade den Focus
    HCBT_SYSCOMMAND Eine Systemmessage wird gerade ausgeführt.

    WPARAM wParam
    

    nCode wParam
    HCBT_ACTIVE Der Handle des gerade akivierten Fensters
    HCBT_CLICKEDSKIPPED Die Mausmessage wurde aus der Systemmessagqueue entfernt
    HCBT_CREATEWND Der Handle des neuen Fensters
    HCBT_DESTROYWND Der Handle des entfernten Fensters
    HCBT_KEYSKIPPED Der Tastencode der aus der Systemmessagqueue entfernten Taste
    HCBT_MINMAX Der Handle des minimierten/maximierten Fensters
    HCBT_MOVESIZE Der Handle der vergösserten/verkleinerten Fensters
    HCBT_QS Muss 0 sein
    HCBT_SETFOCUS Der WindowHandle des fokusierten Windows
    HCBT_SYSCOMMAND Der Wert des Systembefehls

    LPARAM lParam
    

    nCode lParam
    HCBT_ACTIVE Zeiger auf CBTACTIVATESTRUCT, die den aktiven Windowhandle enthält.
    HCBT_CLICKSKIPPED Zeiger auf MOUSEHOOKSTRUCT-Struktur, die Code zum Prüfen der Clickposition und Windowhandle enthält
    HCBT_CREATEWND Zeiger auf CBT_CREATEWND-Struktur, die Initialisierungsparamter des Windows enthält.
    HCBT_DESTROYWND muss 0 sein
    HCBT_KEYSKIPPED Repeatcounter, scanncode, kontextcode....
    HCBT_MINMAX das loword enthält den anzeigestatus (zb. SW_SHOW,SW_HIDE...)
    HCBT_MOVESIZE Zeiger auf RECT, die die Windowkoordinaten enthält
    HCBT_QS muss 0 sein
    HCBT_SETFOCUS Handle des Fensters, das den Fokus verliert
    HCBT_SYSCOMMAND undefiniert

    Die CBTACTIVATESTRUCT -Struktur:

    typedef struct tagCBTACTIVATESTRUCT
    {
        BOOL fMouse,               // Spezifiziert, ob das Window als Ergebnis eines mausklicks aktiviert wird
        HWND hWndActive;     // Handle des aktiven Windows
    } CBTACTIVATESTRUCT, *LP CBTACTIVATESTRUCT;
    

    Die CBT_CREATEWND-Struktur

    typedef struct tagCBT_CREATEWND
    {
        LPCREATESTRUCT lpcs,  // Zeiger auf CREATESTRCUT Struktur, die Informationen über des erzeugte Window enthält.
        HWND hwndInsertAfter,     // Handle auf das Window, dessen Position in de Zorder dem zu erzeugenden Fenster vorausgeht.
    } CBT_CREATEWND, *LPCBT_CREATEWND;
    

    WH_DEBUG..............................Installiert eine Hookprozedur zum Debuggen anderer Hookprozeduren

    Syntax:

    LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Damit verhindert wird, dass das System den Hook aufruft, sollte ein wert != 0 zurückgegben werden.
    Andernfalls sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    Parameter:

    WPARAM wParam
    

    Typ der Hookprozedur der aufgerufen werden soll.

    LPARAM lParam
    

    Zeiger auf DEBUGHOOKINFO-Sturktur

    Die DEBUGHOOKINFO-Struktur

    typedef struct tagDEBUGHOOKINFO
    {
        DWORD idThread, // Thread ID des Threads der den Hook enthält
        DWORD idThreadInstaller, // Handle für den Thread, der den Hook installiert hat
        LPARAM lParam, // Der an den Hook übergebene lParam-Wert
        WPARAM wParam, // Der an den Hook übergebene wParam-Wert
        int code // nCode Wert, der an den Hook übergeben wird
    } DEBUGHOOKINFO;
    

    WH_FOREGROUNDIDLE..........Installiert eine Hookprozedur, die aufgerufen wird, wenn der Vordergrundthread der Anwedung im Begriff ist, inaktiv zu werden.

    Syntax:

    LRESULT CALLBACK ForegroundIdleProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    Parameter:

    int nCode
    

    Gibt an, ob die Hookprozedur die message verarbeiten soll.
    Ist nCode HC_ACTION, muss der Hook die message verarbeiten.
    Ist nCode < 0 wird die message an CallNextHook weitergereicht,
    ohne sie weiter zu verarbeiten,
    dabei sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    WPARAM wParam
    

    nicht verwendet

    LPARAM lParam
    

    nicht verwendet

    WH_GETMESSAGE...................Überwacht Messages unmittelbar nachdem die Funktion GetMessage oder PeekMessage aufgerufen wurde. Alle Messages werden an diesen Filter weitergegeben.

    Syntax:

    LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam,LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook

    Parameter:

    int nCode
    

    Gibt an, ob die Hookprozedur die message verarbeiten soll.
    Ist nCode HC_ACTION, muss der Hook die message verarbeiten.
    Ist nCode < 0 wird die message an CallNextHook weitergereicht,
    ohne sie weiter zu verarbeiten,
    dabei sollte der Rückgabewert von CallNextHook zurückgegeben werden.

    WPARAM wParam
    

    Gibt an, ob die message aus der messagequeue entfernt wurde, wurde sie entfernt ist dieser parameter PM_REMOVE, sonst PM_NOREMOVE.

    LPARAM lParam
    

    Zeiger auf eine MSG Struktur

    Die MSG-Struktur

    typedef struct tagMSG 
    {
      HWND   hwnd;      // handle auf empfängerfenster
      UINT   message;   // die message
      WPARAM wParam;    // informationen
      LPARAM lParam;    // informationen
      DWORD  time;      // absendezeit
      POINT  pt;        // cursorposition zur absendezeit
    } MSG, *PMSG;
    

    WH_JOURNALPLAYBACK.......Gibt eine Eventmessage, die mit WH_JOURNALRECORD aufgezeichnet wurde, wieder, wenn das System einen Event anfordert.

    Syntax:

    LRESULT CALLBACK JournalPlaybackProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode gleich HC_GETNEXT, ist der Rückgabewert gleich der Zeit, angegeben in Ticks, wie lange das System warten sollte.
    Diese Zeit wird aus der Zeit der vorherigen Message und der Zeit der aktuellen message berechnet.
    ist der rückgabewert gleich null, wird die message sofort abgearbeitet.

    Parameter:

    int nCode
    

    bestimmt, wie die Nachricht verarbeitet wird. Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook

    nCode kann einen der folgenden Werte haben:

    HC_GETNEXT Die aktuelle Maus- bzw. Keyboardmessage sollte in die EVENTMSG-Struktur kopiert werden, auf die lParam zeigt.
    HC_NOREMOVE Eine Anwendung hat die Funktion PeekMessage mit Flag PM_NOREMVOE aufgerufen
    HC_SKIP Das Kopieren der nexten Maus- bzw. keyboardmessage ist in vorbereitung
    HC_SYSMODALOFF Ein Systemodaler Dialog wurde entfernt
    HC_SYSMODALON Ein Systemodaler Dialog wird angezeigt

    WPARAM wParam
    

    wird nicht verwendet

    LPARAM lParam
    

    Zeiger auf eine EVENTMSG-Struktur.
    Dieser Zeiger ist nur gültig, wenn nCode == HC_GETNEXT !

    Die EVENTMSG-Struktur:

    typedef struct tagEVENTMSG
    {
        UINT message,    // message
        UINT paramL,     // messageabhängige informationen
        UINT paramH,     // messageabhängige informationen
        DWORD dwTime,    // Absendezeitpunkt
        HWND hwnd        // händl aufs receiverfenster
    } EVENTMSG, *pEVENTMSG;
    

    }

    WH_JOURNALRECORD...........Installiert eine Hookprozedur, die Messages aufzeichnet, die an die Messagequeue des Systems geschickt wurde.

    Syntax:

    LRESULT CALLBACK JournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    wird ignoriert.

    Parameter:

    int nCode
    

    bestimmt, wie die Nachricht verarbeitet wird.
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook

    nCode kann folgende Werte enthalten:

    HC_ACTION Die Inhalte der EVENTMSG-Struktur im lParam-Zeiger werden in einen Puffer oder eine Datei aufgezeichnet.
    HC_SYSMODALOFF Ein Systemmodaler Dialog wurde entfernt - die aufzeichnung geht weiter.
    HC_SYSMODALON EinSystemmodaler Dialog wird angezeigt - aufzeichnung stop.

    WPARAM wParam
    

    wird nicht verwendet.

    LPARAM lParam
    

    Zeiger auf eine EVENTMSG-Strutkur.
    Der Zeiger ist nur gültig, wenn nCode==HC_ACTION !

    WH_KEYBOARD......................Überwacht Tastaturmessages

    Syntax:

    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabwert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook
    Um zu verhindern, dass die nachricht verarbeitet wird, muss der rückgabewert ungleich null seind.
    Damit windows die message an die ziel-windows-procedure wietergeben kann, muss der rückgabwert null sein.

    Parameter:

    int nCode
    

    Ist dieser parameter HC_ACTION, enthalten wParam und lParam Informationen über eine Keyboardmessage.
    Das gilt auch, wenn nCode HC_REMOVE ist, ausser das die message nicht aus der messagequeue entfernt wurde.
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook

    WPARAM wParam
    

    virtueller Keycode der gedrückten Taste

    LPARAM lParam
    

    Repeatcounter, scancode, flag für extended keys, kontextcode...

    WH_KEYBOARD_LL................Überwacht Tastaturmessages am LowLevel ab Win2000

    Syntax:

    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewerte:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.
    andernfalls werden andere für WH_KEYBOARD installierte Hooks nicht aufgerufen und es sollte null zurückgegeben werden.

    Parameter:

    int nCode
    

    Ist nCode==HC_ACTION enthalten lParam und wParam informationen über die keymessage.
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    WPARAM wParam
    

    Nachricht zb. WM_SYSKEYUP, WM_KEYDOWN, WM_KEYUP....

    LPARAM lParam
    

    Zeiger auf eine KBDLLHOOKSTRUCT-Struktur

    Die KBDLLHOOKSTRUCT - Struktur

    typedef struct tagKBDLLHOOKSTRUCT
    {
        DWORD vkCode,     // virtueller keycode
        DWORD scanCode,   // scanCode
        DWORD dwFlags,    // siehe unten
        DWORD dwTime,     // Zeitstempel
        ULONG_PTR dwExtraInfo  // Zusatzinformationen
    } KDBLLHOOKSTRUCT, *PKDBLLHOOKSTRUCT;
    

    Flags:

    0......Sagt aus, ob es sich um eine erweiterete Taste handelt (zb. Funktionstasten)
    1-3....Reserviert
    4......Ist 1, wenn der Event eingespeist wurde, sonst 0
    5......1, wenn die "alt"-Taste gedrückt wird, sonst 0
    6......Reserviert
    7......wird 0, wenn taste gedrückt wird, 1 wenn sie losgelassen wird

    WH_MOUSE.............................Überwacht Mousemessages

    Syntax:

    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.
    Andernfalls werden ander für WH_MOUSE installierte Hooks nicht aufgerufen und des sollte 0 zurückgegeben werden.

    Parameter:

    int nCode
    

    Ist dieser Paramter == HC_ACTION enthalten die Parameter wParam und lParam Informationen über die Mousemessage.
    Das gleiche gilt auch wenn nCode == HC_NOREMOVE ist, ausser dass die message nicht aus der messagequeue entfernt wurde.
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    WPARAM wParam
    

    Nachricht ID

    LPARAM lParam
    

    Zeiger auf MOUSEHOOKSTRUCT-Struktur

    Die MouseHookStruct-Struktur

    typedef struct tagMOUSEHOOKSTRUCT
    {
        POINT pt,             // die Cursorkoordinaten
        HWND  hwnd,           // Handle des Empfängerwindows
        UINT  wHitTestCode,   // Code, wo die Mausnachricht auftrag
        ULONG_PTR dwExtraInfo // Zusatzinformationen
    } MOUSEHOOKSTRUCT;
    

    WH_MOUSE_LL.......................Lowlevel Mousehook ab Win2000

    Syntax:

    LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.
    Andernfalls werden andere für WH_MOUSE_LL installierte Hooks nicht aufgerufen und es sollte 0 zurückgegeben werden.

    Parameter:

    int nCode
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    WPARAM wParam
    

    Mousemessage, zb. WM_LBUTTONDOWN, WM_RBUTTONUP...

    LPARAM lParam
    

    Zeiger auf MSLLHOOKSTRUCT-Struktur

    Die MSLLHOOKSTRUCT-Struktur

    typedef struct tagMSLLHOOKSTRUCT
    {
        POINT pt,              // mauskoordinaten
        DWORD dwData,          // siehe unten
        DWORD dwFlags,         // ist 1, wenn event eingespeist wurde sonst 0
        DWORD dwTime,          // Zeitstempel
        ULONG_PTR dwExtraInfo, // Zusatzinformationen
    } MSLLHOOKSTRUCT;
    

    dwData:
    Ist die Message == WM_MOUSEWHEEL, ist das HIGHWORD das Rad-Delta.
    Das LOWORD ist reserviert.
    ein positiver wert sagt aus, dass das Rad vorwärts gedreht wurde.
    Ein RadClick = WHEEL_DATA gleich 120.

    Ist die Message WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLCK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP oder WM_NCXBUTTONDBLCLK enthält das HIGHWORD den gedrückten Button, das LOWORD ist reserviert.

    WM_MSGFILTER......................Überwacht messages, die as ergebnis
    eines eingabeevents in einem dialog, messagebox, menü oder scrollbar erzeugt wurde.

    Syntax:

    LRESULT CALLBACK MessageProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.
    Andernfalls werden andere für WM_MSGFILTER installierte Hooks nicht ausgeführt und es sollte 0 zurückgegeben werden.

    Parameter:

    int nCode
    

    Typ des Eingabeevents, der die letzte message generiert hat.
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook zurückzugeben.

    MSGF_DDEMGR.... Der Event trat auf, während die DynamicData Exchange ManagementLibrary auf das Ende einer Synchronen Transaktion wartet.
    MSGF_DIALOGBOX.. Der Event trat in einem messagewindow oder dialog auf
    MSGF_MENU....... Der Event trat in einem Menü auf
    MSGF_SCROLLBAR.. Der Event trat in einer Scrollbar auf

    WPARAM wParam
    

    nicht verwendet.

    LPARAM lParam
    

    Zeiger auf MSG-Struktur

    WH_SHELL...............................Empfängt Messages, die für Shellapplikationen nützlich sind

    Syntax:

    LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Sollte NULL sein

    Parameter:

    int nCode
    

    Kann einen folgende Werte haben:

    HSHELL_ACCESSIBILITYSTATE.....Zugriffsstauts hat sich geändert Ab Win2000
    HSHELL_ACTIVATESHELLWINDOW....Ein Fenster auf dem obersten Level, ohne Zuordnung wurde aktiviert
    HSEHLL_APPCOMMAND..........Der User hat den Eingabeevent beendet und die message WM_APPCOMMAND wurde noch nicht bearbeitet ab Win2000
    HSHELL_GETMINRECT..........Das System benötigt von einem gerade min-/maximierten Window die Koordinaten. wParam enthält den Windowhandle, lParam einen Pointer auf eine RECT-Struktur.
    HSHELL_LANGUAGE............Das Keyboardlayout bzw die Keyboardsprache wurden geändert.
    HSHELL_REDRAW..............In der Taskleiste wurde der Titel eines Windows neu gezeichnet. wPram enthält den Windowhandle
    HSHELL_TASKMAN.............Die Taskleiste wurde angeklickt.
    HSHELL_WINDOWACTIVATED.....Ein anderes Fenster auf dem obersten Level, ohne zuordnung wurde aktiviert. wParam enthält den Windowhandle
    HSHELL_WINDOWCREATED.......Ein Window auf dem obersten Level, ohne Zuordnung wurde erzeugt.
    HSHELL_WINDOWDESTROYED.....Ein Window auf dem obersten Level, ohne Zuordnung wurde entfernt.

    WPARAM wParam
    

    siehe nCode

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook

    WH_SYSMSGFILTER...............Wie WH_MSGFILTER, lässt sich aber auf das ganze System anwenden.

    Syntax:

    LRESULT CALLBACK SysMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    Rückgabewert:

    LRESULT
    

    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook .
    Andernfalls werden für WM_SYSMSGFILTER installierte Hooks nicht aufgerufen und es sollte NULL zurückgegeben werden.

    Parameter:

    int nCode
    

    Siehe WH_MSGFILTER (ausser MSGF_DDEMGR)
    Ist nCode < 0 muss der Rückgabewert von CallNextHook zurückgegeben werden.
    Ist nCode > 0 empfiehlt es sich den Rückgabewert von CallNextHook .

    WPARAM wParam
    

    wird nicht verwendet.

    LPARAM lParam
    

    Pointer auf MSG-Struktur

    HOOKPROC hkprc
    

    Zeiger auf die Hookprozedur. Ist dwThreadID auf NULL gesetzt oder enthält die ID von einem Thread eines anderen Prozesses, muss dieser Parameter auf eine Hookprozedur in einer DLL zeigen, sonst kann er auf eine Hookprozedur der aktuellen anwendung zeigen.

    HINSTANCE hMod
    

    Instanzhandler der DLL, welche die Hookprozedur enthält, auf welche hkprc zeigt.
    Dieser Parameter muss auf NULL gesetzt werden, wenn dwThreadID einen Thread des aktuellen Prozesses darstellt.

    DWORD dwThreadID
    

    ThreadID die der Hookprozedur zugeordnet werden soll.
    Ist dieser Parameter NULL, wird die Hookprozedur allen Threads zugeordnet.

    HOOK ENTFERNEN:

    Syntax:

    BOOL UnhookWindowsEx(HHOOK hhook);
    
    UnhookWindowsEx
    

    entfernt eine Hookprozedur aus der Kette.

    Rückgabewert:

    TRUE, wenn erfolgreich, sonst FALSE

    Parameter:

    HHOOK hhook
    

    Handle auf den Hook, der entfernt werden soll.



  • Wow, super Beitrag. Danke Ernsti. Ich glaub das wär was für die FAQ 🙂



  • @Ernsti
    Wow, wirklich ein Klasse beitrag. Die sachen standen auch so ziemlich alle im Buch. Hab nur noch was gesucht das tiefer in das Thema geht.
    Bin auch dafür das dies hier in die FAQ sollte...
    Werd mir aber deine spitzen zusammenfassung mal genauer anschauen...
    Thanx



  • Is noch nicht ganz komplett, wie ihr seht fehlen noch einige beschreibungen, bin aber aus zeitgründen noch nicht dazu gekommen. !



  • so, das ist erstmal ferddig - wenn ihr wollt, könnt ihr das in die FAQ klatschen 🤡



  • Wäre klasse wenn man dies hier in die FAQ verschiebene könnte, da sich Ernsti so viel mühe gegeben hat und alles so super erklärt...



  • So, nun ein kleines Beispiel für unser "Hook"-rigen Freunde ! 🤡

    Also, es ist ein einfaches Beispiel, welches die Mauskoordinaten in der X und Y Position mal zwei rechnet, und die umgewandelteten Korrdianten im Tracefenster ausgibt.

    Das ganze ist eine einfache Dialoganwendung.

    //*****************************************************************************
    // HookDlg.h
    //*****************************************************************************
    #pragma once
    
    class CHookDlg : public CDialog
    {
    public:
    	CHookDlg(CWnd* pParent = NULL);	
    	enum { IDD = IDD_HOOK_DIALOG };
    	static HHOOK   hMouseHook;
    protected:
    	virtual BOOL OnInitDialog();
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnDestroy();
    };
    
    //*****************************************************************************
    //*****************************************************************************
    //*****************************************************************************
    
    //*****************************************************************************
    // hookdlg.cpp installiert einen maushook, der die koordinaten ändert.
    // die geänderten koordinaten werden rausgetraced.
    //*****************************************************************************
    
    #include "stdafx.h"
    #include "Hook.h"
    #include "HookDlg.h"
    
    //*****************************************************************************
    // static member
    HHOOK CHookDlg::hMouseHook=NULL;
    
    //*****************************************************************************
    // hookprozedur
    //*****************************************************************************
    LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
    	if(nCode >= 0 && nCode == HC_ACTION) 
    	{ 
    		MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*) lParam; 
    		long nTempX = mhs->pt.x*2; 
    		long nTempY = mhs->pt.x*2; 
    
    		HWND hwnd=FindWindow(NULL,"Hook");  // Hook ist der Titel unseres Dialogs !!!!
    
    		if(!hwnd) 
    			TRACE("Fenster nicht gefunden !"); 
    
    		PostMessage(hwnd, nCode, wParam, MAKELPARAM(nTempX, nTempY)); 
    
    		CString str; 
    		str.Format("X:%d (%d) ,Y:%d (%d)\n",nTempX,mhs->pt.x,nTempY,mhs->pt.y); 
    		TRACE(str); 
    	} 
    	return CallNextHookEx(CHookDlg::hMouseHook, nCode, wParam, lParam); 
    } 
    
    //*****************************************************************************
    // konstruktor
    //*****************************************************************************
    CHookDlg::CHookDlg(CWnd* pParent ) : CDialog(CHookDlg::IDD, pParent)
    {
    
    }
    
    //*****************************************************************************
    // messagemap
    //*****************************************************************************
    BEGIN_MESSAGE_MAP(CHookDlg, CDialog)
    	ON_WM_DESTROY()
    END_MESSAGE_MAP()
    
    //*****************************************************************************
    // hook anlegen
    //*****************************************************************************
    BOOL CHookDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	hMouseHook = SetWindowsHookEx(WH_MOUSE,   (HOOKPROC) MouseHookProc, AfxGetInstanceHandle(),AfxGetThread()->m_nThreadID);
    	return TRUE; 
    }
    
    //*****************************************************************************
    // hier hook wieder entfernen !
    //*****************************************************************************
    void CHookDlg::OnDestroy()
    {
    	if(hMouseHook)
    	{
    		UnhookWindowsHookEx(hMouseHook);
    		hMouseHook=NULL;
    	}
    }
    
    //*****************************************************************************
    //*****************************************************************************
    //*****************************************************************************
    
    [cpp]
    


  • Was soll ein nicht-globaler Hook bringen? In meinem eigenen Programm komm ich doch eh an alle Messages.



  • Du kannst die Nachrichten "manipulieren" - ändern - oder sonstwas.
    Du kannst Nachrichten rausfiltern, aus Mausmessages Tastaturmessages machen....

    Ich musste mal für eine Anwendung die Mauskoordinaten um 90 Grad drehen (ich glaube da müssten noch reste im forum stehen...), da nahm ich eben diesen Maushook.
    Und ausserdem stellt es nur ein grundlegendes Beispiel über einen Hook dar.
    Ich wollte hier nicht die volle Megaanwendung coden, die keiner mehr lesen kann.
    Aber falls noch irgendwelche Fragen im Raum sehen, werde ich natürlich versuchen, sie so gut als möglich zu beantworten. 😉



  • Dann kann man das doch einfach in der Nachrichtenschleife ändern und filtern??



  • So, ich hatte eine ANwendung, in der ich einen (GDI) Dialog über DirectX (damals 7.0) um 90 Grad gedreht als DirectX Surface auf den Schirm geblittet habe.
    Nun befanden sich auf diesem Dialog normale Windows Steuerelemente.
    Um mit diesen korrekt zu arbeiten musste ich die mauskoordinaten um 90 grad drehen......

    So, zeig mir mal, wie du eine Nachricht zb. ON_BNCLICKED, ON_COMMAND, ON_WM_LBUTTONDOWN, usw..... von irgendwelchen Steuerelementen änderst, so das das Steuerelement reagiert, als wäre der Dialog nicht gedreht gezeichnet ?????

    ... viel spass ...



  • Also Maus und Tastaturnachrichten (bzw. alle Nachrichten die gepostet werden) kann ich in PreTranslateMessage ändern.


Anmelden zum Antworten