Einzelnen Beitrag anzeigen

Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#1

[C] Shell Hook?

  Alt 19. Sep 2007, 16:33
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!
  Mit Zitat antworten Zitat