Ich versuche zu öffnen und schließen Windows mit einem globalen Windows-Hook zu beobachten. Daher versuche ich Callback-Funktionen an die DLL zu übergeben, die meine Hook-Prozedur enthält. Die Hook-Prozedur selbst wird jedoch nie aufgerufen.Beobachten Sie geöffnete Fenster mit SetWindowsHookEx
/** Handle to this DLL */
HINSTANCE dllModule = 0;
/** Hook procedure */
HHOOK windowHook = 0;
/** Callbacks are called when a new window is opened, or closed. */
HWND_CALLBACK windowOpenCallback = 0;
HWND_CALLBACK windowCloseCallback = 0;
WINDOWHOOK_API int WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
dllModule = hInstance;
std::cout << "Process attached." << std::endl;
}
else if (reason == DLL_PROCESS_DETACH)
{
std::cout << "Process detached." << std::endl;
}
else if (reason == DLL_THREAD_ATTACH)
{
}
else if (reason == DLL_THREAD_DETACH)
{
}
return 1;
}
WINDOWHOOK_API bool setWindowHook(HWND_CALLBACK openCallback, HWND_CALLBACK closeCallback)
{
if(windowHook != 0 || windowOpenCallback != 0 || windowCloseCallback != 0)
{
return false;
}
windowOpenCallback = openCallback;
windowCloseCallback = closeCallback;
windowHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)hookCallback, dllModule, 0);
return windowHook != 0;
}
WINDOWHOOK_API bool releaseWindowHook()
{
bool result = windowHook != 0 && UnhookWindowsHookEx(windowHook) != 0;
windowHook = 0;
windowOpenCallback = 0;
windowCloseCallback = 0;
return result;
}
LRESULT CALLBACK hookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
std::cout << "Hook callback" << std::endl;
return CallNextHookEx(windowHook, nCode, wParam, lParam);
}
Von meinem Hauptprogramm lade ich die Bibliothek und rufe die setWindowHook-Prozedur auf. Ich starte dann einfach eine Endlosschleife und warte darauf, dass der Hook aufgerufen wird, aber obwohl setWindowHook nicht fehlschlägt, wird die Hook-Prozedur nie aufgerufen. Ich verstehe nicht warum.
Ich habe versucht, einen WH_KEYBOARD Haken zu setzen. Damit wurde die Hook-Prozedur auf Tastendrücken aufgerufen, aber nur, wenn sie sich im Konsolenfenster meines Programms befanden.
Ich kompiliere dies zu 32bit auf einer 64-Bit-Maschine. Aber sollte es nicht zumindest für alle meine 32-Bit-Anwendungen funktionieren?
Vielen Dank im Voraus.
Ihr Hook wird wahrscheinlich aufgerufen, aber es wird auf einem Thread aufgerufen, der zu dem Prozess gehört, in den es injiziert wurde. Es wird versuchen, im Kontext des anderen Prozesses nach 'std :: cout 'auszugeben und für die meisten Windows-Prozesse wird dies fehlschlagen, da sie keine angeschlossene Konsole haben. Verwenden Sie eine andere Methode zum Überwachen Ihres Hooks, bei der nicht auf die Konsole geschrieben wird. –
Danke, das war in der Tat das Problem. Jetzt stehe ich jedoch vor einem anderen. Die Idee, einen Callback zu übergeben, der aufgerufen wird, wenn ein Fenster geöffnet wird, funktioniert nicht wirklich. Während ich die Funktion ptr für alle Prozesse freigeben konnte, die die DLL geladen haben, konnten die Prozesse sie nicht aufrufen, weil sie in einem anderen Adressraum leben. Wie kann ich sie mit meinem Programm kommunizieren lassen? Ich könnte Fensternachrichten senden, aber diese werden nicht garantiert behandelt, oder? –
Das Zurücksetzen von Nachrichten zu Ihrem Hauptfenster funktioniert (lesen Sie über WM_COPYDATA). Shared Memory funktioniert (mit geeigneter Verriegelung). Steckdosen können funktionieren, aber Sie müssen vorsichtig mit den Griffen umgehen. –