KEYBOARD Hook

JavaJoe

Mitglied
Hey!
Ich versuche mich grade an einem Keybord Hook.
Ich habe dazu das Pipetten Tutorial gelesen und meine alles gleich gemacht zu haben aber wenn ich den Hook installieren will bekomm ich immer den Fehlercode 0.

Hier mal die Dll:

Code:
#include "dll.h"
#include <iostream.h>
#pragma comment(linker, "/section:.HKT, rws")

#pragma data_seg(".HKT")
HHOOK hook      = NULL;
BOOL  sg_bHookInstalled    = FALSE;
HINSTANCE  dll        = NULL; 
#pragma data_seg()

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    dll=hInst;

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}



extern "C"
{

DLLIMPORT void hello(void)
{
 
 cout<<"Hallo!";
 MessageBox(0,"HALLO","hi",MB_ICONINFORMATION);
          
}

}


extern "C"
{

DLLIMPORT bool install()
{
     MessageBox(0,"Lade","...",MB_ICONINFORMATION);         
    
     hook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,dll,0);       
     
     if(hook==NULL)
     {
                   
     MessageBox(0,"Fehler","...",MB_ICONINFORMATION);              
     cout<<GetLastError();
     return FALSE;
     
     }
     
     return TRUE;
}

}

extern "C"
{

DLLIMPORT bool uninstall()
{
          
          
          
}

}



LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    cout<<"Taste gedrückt";   
    
    if(nCode<0)
               return CallNextHookEx(hook,nCode,wParam,lParam);   
    
    if(nCode==HC_ACTION)
    {
        
        switch(wParam)
              case 0x41: cout<<"A gedrückt!";
        
         return CallNextHookEx(hook,nCode,wParam,lParam);                     
                        
    }
              
        
}

Was mir noch nicht klar ist ist die sache mit dem Shared data segment. Vielleicht liegt der fehler ja da...
 
Nja kenn das tutorial nicht. wofür is das mitm dll-übergreifenden variablen und so?
C++:
#include "Dll.hpp"
#include <iostream>

::HINSTANCE g_hInstance(NULL);
::HHOOK g_hHook(NULL);

BOOL APIENTRY DllMain (::HINSTANCE hInstance, DWORD, LPVOID)
{
    g_hInstance = hInstance;
    return TRUE;
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    std::clog << "INFO: Taste gedrückt! " << std::endl;   
    
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case 0x41:
            std::clog << "\b> Buchstabe A" << std::endl;
            break;
        }
    }
    
    return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);   
}

extern "C"
{
    DLLIMPORT const bool install()
    {
        ::MessageBoxW(NULL, L"Keyboard Hook wird installiert!", L"Information", MB_OK | MB_ICONINFORMATION);         
        
        if ((g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, static_cast<::HOOKPROC>(KeyboardProc), g_hInstance, 0)) == NULL)
        {
            ::MessageBoxW(NULL, L"Keyboard Hook konnte nicht installiert werden!", L"Fehler", MB_OK | MB_ICONERROR);              
            std::cerr << "FEHLER: > " << ::GetLastError() << " <" << std::endl;
            return false;
        }
        return true;
    }

    DLLIMPORT const bool uninstall()
    {
        ::MessageBoxW(NULL, L"Keyboard Hook wird deinstalliert!", L"Information", MB_OK | MB_ICONINFORMATION);         
        std::cerr << "FEHLER: Noch nicht implementiert!" << std::endl;              
    }
} // extern "C"
dein Code mal aufgeräumt ;)
 
Danke mit sauberem code hab ichs nicht so;)
Soweit ich das verstanden habe muss das sein, weil die DLL mehrfach geladen wird und alle Instanzen auf die gleichen Daten zugreifen müssen.
So richtig verstanden hab ich das jedoch nicht....
 
Zurück