Hooks
-
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 FunktionUnhookWindowsEx
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_SYSCOMMANDParameter:
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 SystembefehlsLPARAM 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 undefiniertDie 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 CallNextHookParameter:
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 CallNextHooknCode 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 angezeigtWPARAM 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 CallNextHooknCode 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 CallNextHookWPARAM 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 wirdWH_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 aufWPARAM 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 CallNextHookWH_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.