InstallHook lässt sich nur einmal erfolgreich ausführen.



  • Hallo,
    ich habe das Problem, dass mein Hook sich pro Programmstart nur einmal installieren lässt.
    Wenn ich also InstallHook(), UnInstallHook() ausführe und den Hook dann wieder installieren möchte mit InstallHook() liefert SetWindowsHookEx() NULL zurück.
    Meine dll.h sieht so aus:

    // mhook.h
    #ifndef _mhook_
    #define _mhook_
    
    #include <windows.h>
    #include <string>
    #include <iostream>
    #using <system.dll>
    
    using namespace std;
    
    #if defined DLL_EXPORT
    #define DECLDIR __declspec(dllexport)
    #else
    #define DECLDIR __declspec(dllimport)
    #endif
    
    using namespace System;
    extern "C"
    {
    	DECLDIR BOOL InstallHook();
    	DECLDIR BOOL UninstallHook();
    
    	LRESULT CALLBACK MouseProc(int nCode, WPARAM, LPARAM);
    }
    
    #endif
    

    Meine dll.cpp sieht so aus:

    // Dies ist die Haupt-DLL.
    
    #include "stdafx.h"
    
    #include "mhook.h"
    
    //#define DLL_EXPORT
    
    #pragma data_seg("shared")
    // Globale Variablen 
    HHOOK g_hMouseHook = NULL; // Handle unseres Hooks (als "shared" Deklariert) 
    HINSTANCE g_hInst = NULL;     // Handle der DLL selbst 
    
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:shared,RWS")
    
    extern "C"{
    	#pragma unmanaged
    	BOOL APIENTRY DllMain (	HINSTANCE hInst     /* Library instance handle. */ , 
    									DWORD reason        /* Reason this function is being called. */ , 
    									LPVOID reserved     /* Not used. */ ){ 
    		g_hInst = hInst; 
    
    		return TRUE; 
    	}
    
    	DECLDIR BOOL InstallHook(){ 
    			if(g_hMouseHook != NULL) 
    				return TRUE; 
    			g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0); 
    			if(g_hMouseHook == NULL) {
    				DWORD error = GetLastError();
    				char* temp;
    				temp = new char[100];
    				sprintf(temp, "%d", error);
    				MessageBoxA(NULL,LPCSTR(temp) ,NULL,MB_OK);
    				delete []temp;
    				return FALSE; 
    			}
    			return TRUE; 
    		} 
    
    	DECLDIR BOOL UninstallHook(){ 
    		if(g_hMouseHook != NULL) 
    		{ 
    			BOOL ret = UnhookWindowsHookEx(g_hMouseHook);
    			g_hMouseHook = NULL;
    			if(ret==FALSE){
    				DWORD error = GetLastError();
    				char* temp;
    				temp = new char[100];
    				sprintf(temp, "%d", error);
    				MessageBoxA(NULL,LPCSTR(temp) ,NULL,MB_OK);
    				delete [] temp;
    				return FALSE;
    			}
    
    		} 
    		return TRUE; 
    	}
    
    	LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)	{ 
    		if (nCode < 0) 
    		return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam); 
    		if(nCode == HC_ACTION) 
    			{ 
    			if ( (wParam == WM_RBUTTONDOWN) ) { 
    				MOUSEHOOKSTRUCT *mhs = (MOUSEHOOKSTRUCT*)lParam; 
    
    				HWND caller = FindWindowA("WindowsForms10.Window.8.app.0.378734a","meinprog");
    				if(caller != NULL) 
    					PostMessage(caller, WM_APP+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y)); 
    			} 
    		} 
    		return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam); 
    	}
    }
    

    GetLastError() liefert in der InstallHook dann übrigens auch 0.

    Der Load-Code:

    hInstLibrary = LoadLibraryA("E:\\Eigene Dateien\\Visual Studio 2008\\Projects\\mhook\\Debug\\mhook.dll");
    			if(hInstLibrary){
    				InstallHook = (MYFUNC) GetProcAddress(hInstLibrary, "InstallHook"); 
    				if(InstallHook == NULL) { 
    					MessageBoxA(NULL, "Error: Installhook not found", "Error",  MB_ICONHAND|MB_OK|MB_TOPMOST);					
    				} 
    				UninstallHook = (MYFUNC) GetProcAddress(hInstLibrary, "UninstallHook"); 
    				if(UninstallHook == NULL) { 
    					MessageBoxA(NULL, "Error: Uninstallhook not found", "Error", MB_ICONHAND|MB_OK|MB_TOPMOST); 
    					return; 
    				}			
    			}
    

    install und uninstall vom hook in der checkedChanged:

    if(!hInstLibrary)
    					this->CBShortcuts->Checked=false;
    				if(this->CBShortcuts->Checked){
    					if(hInstLibrary){
    						BOOL ret = InstallHook();
    						if(ret == FALSE) 
    							MessageBoxA(NULL, "InstallHook failed!", "Error!", MB_OK|MB_TOPMOST); 
    
    					}
    					else this->CBShortcuts->Checked = false;
    				}
    				else{
    					if(hInstLibrary){
    						BOOL ret = UninstallHook();
    						if(ret == FALSE) 
    							MessageBoxA(NULL, "UninstallHook failed!", "Error!", MB_OK|MB_TOPMOST); 
    					}
    				}
    

    Hat jemand eine Idee woran es liegt?

    danke im voraus
    veio



  • Kleiner Hinweis :

    Das Betriebssystem garantiert nicht, daß eine DLL in jedem Prozess an die gleiche Adresse gemappt wird.



  • hm, ich lade die DLL ja nur einmal in meinem Prozess, oder wird die dll noch woanders automatisch gemapped?



  • Wenn der letzte Parameter von SetWindowsHookEx 0 ist, dann wird der Hook global und die DLL wird in jeden Prozess gemappt.

    Probier mal das :

    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, GetCurrentThreadId ());
    

    Dann bleibt der Hook lokal und (vorerst) gut ist. 😋



  • Dann bekomme ich aber nicht alle mausklicks oder nicht? Und das wäre dann nicht der Sinn an der Sache 😉


Anmelden zum Antworten