Hook ist nur lokal und nicht global ... .?

gamerfunkie

Erfahrenes Mitglied
Hallo,
ich habe eine DLL programmiert die sich in die HookChain einklinkt und dann über ::PostMessage() eine Information über einen tastendruck an mein programm sendet.
Code:
#define BUILDING_DLL

#include "dll.h"

// Globale Variablen
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
#pragma data_seg(".shr")
HHOOK g_hKeyboardHook = NULL;    // Handle unseres Hooks (als "shared" Deklariert)
HHOOK g_hMouseHook = NULL;    // Handle unseres Hooks (als "shared" Deklariert)
HINSTANCE g_hInst = NULL;     // Handle der DLL selbst
#pragma data_seg()

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;
}

DLLIMPORT BOOL InstallHook()
{ 
    if(g_hKeyboardHook != NULL)
        return TRUE;
    if(g_hMouseHook != NULL)
        return TRUE;

    g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInst, NULL);
    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, NULL);

    if(g_hKeyboardHook == NULL)
        return FALSE;
    if(g_hMouseHook == NULL)
        return FALSE;
        
    return TRUE;

}

DLLIMPORT BOOL UninstallHook()
{
    if(g_hKeyboardHook != NULL)
    {
        UnhookWindowsHookEx(g_hKeyboardHook);
        g_hKeyboardHook = NULL;
    }
    if(g_hMouseHook != NULL)
    {
        UnhookWindowsHookEx(g_hMouseHook);
        g_hMouseHook = NULL;
    }
    return TRUE;
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode >= 0)
    {
        HWND hwnd = FindWindowA(NULL,"hook_test_app");
        PostMessage(hwnd,WM_USER+wParam,wParam,lParam);
    }
    return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
}

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode >= 0)
    {
        HWND hwnd = FindWindowA(NULL,"hook_test_app");
        //PostMessage(hwnd,WM_USER+wParam,wParam,lParam);
    }
    return CallNextHookEx(g_hMouseHook, nCode, wPaporam, lParam);
}

p

leider werden nur hooks empfangen, wenn sie zur anwendung gehören,also keine globalen hooks.
Hoffentlich könnt ihr mir helfen.
 
Hallo,
ich habe eine DLL programmiert die sich in die HookChain einklinkt und dann über ::PostMessage() eine Information über einen tastendruck an mein programm sendet.
Ah da will jemand nen Keylogger bauen :-)

Welchen Compiler verwendest du genau?

Bist du sicher das die Zeilen für das Shared-Data-Segment so korrekt sind für deinen Compiler?

Ich hatte das damals mit Visual Studio 6 getestet:
Code:
#pragma data_seg ("shared") 
// variablen deklaration die in das Shared-Data-Segment kommen:
int i_MyIntVar = 0;
#pragma data_seg () 
#pragma comment(linker,"/SECTION:shared,RWS")

Ob das dann für VS 2003 oder VS 2005 oder gar VS 2008 noch so gilt kann ich dir jetzt nicht sagen, musst mal bei Google suchen oder so.
 
ich benutze VS 2005, aber ich weiß nicht recht obs noch so geht.
Kann es daran liegen das ich dasmit ner Konsole mache? Also die "Hooks empfangen" ?
Ich probiers mal ...
 
Also ich muss doch den SHARED bereich nur in der DLL festlegen oder?
Ja auf alle Fälle.
Schau dir nochmal mein Tutorial an, damit du das mit dem Shared-Data-Segment verstehst.
Dann musst du hald prüfen ob das Anlegen dieses Segments mit dem VS2005 noch genauso geht wie mit dem VS6, das weis ich nicht, aber das wirst du sicherlich in der MSDN oder über google schon rausfinden.
 
Okay,
wie das angelegt wird weiss ich jetzt. Ich muss es ja nur in der DLL anlegen ....
Aber mein Problem besteht weiterhin ... :(
Woran könnte es denn noch liegen?
 
Sorry, wenn ich den Thread wieder ausgrabe,
aber ich habe genau das selbe Problem.
Die Hooks werden nur erkannt, wenn ich im Anwendungsfenster bin, obwohl ich den Hook global installiert habe.

Konntest du das Problem damals denn noch lösen gamerfunkie?
Oder hat irgendwer anders noch ne Idee dazu?
 
Hat sich erledigt.
Im debugger hat er irgendwie nicht global reagiert,
aber jetzt habe ich ne MessageBox rein gepackt und wie wird wirklich immer aufgerufen.
 
Zurück