Warum muss der SetWindowsHookEx verwendet werden, die mit einer windows-message queue
Ich versuche schon einige Dinge mit Haken, und ich verstehe nicht, warum die Haken müssen verwendet werden, mit einer message queue
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
Warum nicht so etwas wie diese Arbeit ?
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
Mit boost threads, und eine Barriere, die nicht funktioniert entweder. Warum kann nicht die Wartezeit zwischen den Haken und lösen Sie getan werden, in einer anderen Art und Weise ?
EDIT:
Ich habe einen Fehler gemacht als ich dieses Beispiel erstelle ich ein WH_KEYBOARD_LL Haken, WH_KEYBOARD nicht, (ich glaube nicht, dass es einen großen Unterschied macht)
Auch die Schleife nie ausgeführt, nur wartet auf die GetMessage-Funktion.
Die Schleife wird nur ausgeführt, wenn ich die quit-Nachricht PostThreadMessage(id, WM_QUIT, 2323, NULL);
so verstehe ich nicht, was es zu tun neben warten, gibt es einige interne Verarbeitung ?
VERWANDTE:
C++ SetWindowsHookEx WH_KEYBOARD_LL Richtige Setup
Wie kann ich ein CBT-hook auf ein Win32-Konsole-Fenster?
InformationsquelleAutor Ha11owed | 2011-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den low-level-hooks, WH_KEYBOARD_LL und WH_MOUSE_LL unterscheiden sich von allen anderen Haken. Sie erfordern nicht eine DLL injiziert werden in die Ziel-Prozess. Stattdessen ruft Windows hook-callback-direkt, in Ihrem eigenen Prozess. Zu machen, arbeiten, ist eine nachrichtenschleife erforderlich. Es gibt keinen anderen Mechanismus für Windows, um Rückrufe auf Ihrem Haupt-thread, der Rückruf kann nur auftreten, wenn Sie genannt habe, Bekommen/PeekMessage (), so dass Windows die Kontrolle.
Einen globalen hook wie WH_KEYBOARD ist sehr unterschiedlich. Es erfordert eine DLL und der Rückruf erfolgt innerhalb des Prozesses, die Verarbeitung der Tastatur-Nachricht. Sie brauchen eine Art von inter-Prozess-Kommunikation, lassen Sie Ihre eigenen Programm bekannt. Named pipes sind die übliche Wahl. Die sonst natürlich Voraus, dass dieser Prozess injiziert Pumpen eine message-loop. Es würde nicht Tastatur Nachrichten sonst.
Zugunsten einer low-level-hook, sind Sie viel leichter in Gang zu kommen. Aber Pumpe oder es wird nicht funktionieren. Und Vorsicht vor timeouts, wenn Sie nicht sensibel genug ist, dann wird Windows töten, Ihre Haken, ohne Ankündigung.
Das Verständnis der low-level-Maus-und Tastatur-hook " (win32)
Du verstehst es richtig. Es gibt keinen anderen Weg, um sicher zu injizieren Aufrufe in einem thread, es hat sich im Leerlauf sein. Dies ist der Grund, warum message-loops existieren.
um zu klären, sind Sie darauf hindeutet, dass für die Globale hooks wie WH_KEYBOARD named pipes können verwendet werden, um die "pass" - info zurück zu meinem eigenen Programm, und das Programm muss nicht eine Meldung Pumpe?
Das ist richtig.
InformationsquelleAutor Hans Passant
Windows Hooks Haken Sie die Windows-message-loop): http://msdn.microsoft.com/en-us/library/ms644959#wh_keyboardhook
Konsole Anwendungen Pumpen nicht, die Nachrichten selbst - die-Konsole-Prozess hat. So wird es nicht funktionieren, es sei denn, der Prozess hat eine message-Schleife.
Finden Sie unter:
Wie kann ich ein CBT-hook auf ein Win32-Konsole-Fenster?
C++ SetWindowsHookEx WH_KEYBOARD_LL Richtige Setup
Auch, da GetMessage wartet, bedeutet das nicht, dass die Konsole nicht Pumpen jede Nachricht bis zu meinem quit-Nachricht ?
Siehe Han-Antwort - Windows wird nur rufen Sie Ihren thread zurück, wenn es weiß, dass seine im Leerlauf. Und wenn der thread gesperrt ist GetMesasge() Windows weiß, dass es nichts macht
InformationsquelleAutor shf301