AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[C] Shell Hook?

Ein Thema von Rastaman · begonnen am 19. Sep 2007 · letzter Beitrag vom 19. Sep 2007
Antwort Antwort
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, 15: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
Benutzerbild von Rastaman
Rastaman

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

Re: [C] Shell Hook?

  Alt 19. Sep 2007, 17:27
Ok hat sich erledigt.
Beim Erstellen des Hooks musste man das Handle der DLL angeben, nicht das der ExE

Edit: Das Ergebnis zum Beweis, dass ich auch keinen Keyhook machen wollte
Funktioniert nur ab Windows 2000. Jedes Fenster das neu geöffnet wird ist transparent
Angehängte Dateien
Dateityp: zip transparencytest_150.zip (21,8 KB, 13x aufgerufen)
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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