Hallo.
Ich bin grad so ziemlich am verzweifeln.
Ich hatte vor, einen Hook zu schreiben, der mir Nachricht gibt, wenn ein neues Top-Level-Fenster erstellt wird,
da ein Timer mit EnumWindows einfach unsauber ist und auch noch zu viel Leistung frisst.
Jetz klappt das Ganze allerdings nur so halb.
Die
DLL:
Code:
#include <windows.h>
HHOOK HookHandle = NULL;
HWND WndHandle = 0;
bool
WINAPI InstallHook(HWND, HINSTANCE);
bool
WINAPI UninstallHook();
LRESULT CALLBACK ShellProc(int, WPARAM, LPARAM);
bool
WINAPI InstallHook(HWND hWnd, HINSTANCE hInstance)
{
if ((HookHandle != NULL) || !(IsWindow(hWnd)))
return false;
WndHandle = hWnd;
HookHandle = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)ShellProc, hInstance, 0);
return HookHandle != NULL;
}
bool
WINAPI UninstallHook()
{
if (HookHandle == NULL)
return false;
return UnhookWindowsHookEx(HookHandle) != 0;
}
LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(HookHandle, nCode, wParam, lParam);
if (nCode == HSHELL_WINDOWCREATED)
{
MessageBox(0, "Hui!", "", 0);
}
return 0;
}
Export.def:
Code:
EXPORTS
InstallHook;
UninstallHook;
Programm (Nur das Wichtige):
Code:
typedef bool (
WINAPI *INSTALL)(HWND hWnd, HINSTANCE hInstance);
typedef bool (
WINAPI *UNINSTALL)();
INSTALL InstallHook;
UNINSTALL UninstallHook;
...
if (!LoadHookProcs())
{
MessageBox(0, "Fehler beim Laden der
DLL.", "Fehler", MB_ICONERROR);
return 0;
}
...
bool LoadHookProcs()
{
hLib = LoadLibrary("
dll.dll");
if (hLib == NULL)
return false;
InstallHook = (INSTALL)GetProcAddress(hLib, "InstallHook");
UninstallHook = (UNINSTALL)GetProcAddress(hLib, "UninstallHook");
if ((InstallHook != NULL) && (UninstallHook != NULL))
return true;
return false;
}
...
if (InstallHook(hWnd, hInstance))
return 0;
MessageBox(hWnd, "Der Window-Hook konnte nicht installiert werden.", "Fehler", MB_ICONERROR);
Wenn das Problem doch Compiler-Fehler wären, sind es aber nicht.
Wenn ich das Programm starte bekomme ich immer exakt 36 Messageboxen mit "Hui" aufgetischt. Ende.
Es passiert nichts wenn ich andere Fenster öffne. Einfach nichts passiert mehr.
Ich habe das ganze mal einfach in einen Keyhook geändert und aus WH_SHELL WH_KEYBOARD gemacht.
Es scheint erst alles zu funktioniere, es kommen beim Knopfdruck 2 Messageboxen. Aber sobald das
Fenster einmal Focus verliert passiert gar nichts mehr bei Knopfdruck. Auch, wenn es den Focus wieder bekommt.
Jemand eine Idee?
Chuck Norris has counted to infinity ... twice!