Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] Shell Hook? (https://www.delphipraxis.net/99918-%5Bc%5D-shell-hook.html)

Rastaman 19. Sep 2007 15:33


[C] Shell Hook?
 
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? :cry:

Rastaman 19. Sep 2007 17:27

Re: [C] Shell Hook?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hat sich erledigt.
Beim Erstellen des Hooks musste man das Handle der DLL angeben, nicht das der ExE :wall:

Edit: Das Ergebnis zum Beweis, dass ich auch keinen Keyhook machen wollte :lol:
Funktioniert nur ab Windows 2000. Jedes Fenster das neu geöffnet wird ist transparent :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz