rt
如何写一个全局钩子所需的的dll????

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=271看看这个例子吧!
      

  2.   

    #include "stdafx.h"
    #include <afxdllx.h>
    #include "HookClass.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    #pragma data_seg("SHARDAT")
    CHookClass HookClass;
    HINSTANCE hInst = NULL ;
    HHOOK hLLKeyboardHook = NULL; #pragma data_seg()
    #pragma comment(linker,"/SECTION:SHARDAT,RWS")
    char strModulePath[MAX_PATH] ;// Handle to LowLevel kbd hookstatic AFX_EXTENSION_MODULE SKHookDLL = { NULL, NULL };extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);
        
    if (dwReason == DLL_PROCESS_ATTACH)
    {
    hInst = hInstance;
    if (!AfxInitExtensionModule(SKHookDLL, hInstance))
    return 0;
    new CDynLinkLibrary(SKHookDLL);
    GetSystemDirectory(strModulePath,MAX_PATH);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    TRACE0("TFHOOK.DLL Terminating!\n");
    // Terminate the library before destructors are called
    AfxTermExtensionModule(SKHookDLL);
    }
    return 1;   // ok
    }void __declspec(dllexport)  __StartHook()
    {
    HookClass.StartHook(); 
    }
    void  __declspec(dllexport)  __StopHook()
    {
    HookClass.StopHook(); 
    }LRESULT CALLBACK LowLevelKeyboardFilterProc(int nCode, 
    WPARAM wParam,
    LPARAM lParam)
    {
    /* if(HC_ACTION==nCode)
    {
    FILE *file;
    file = fopen("c:\\test.txt","a+");
    fprintf(file,"%08X-%08X\n",wParam,lParam);
    fclose(file);
    }
    /*/
    SHORT wState = GetKeyState(VK_CONTROL);
    if(!((DWORD)lParam&0x80000000) && (HC_ACTION==nCode) &&  ((wParam == 191) && (wState&0x8000) ||  ((wParam == 0xFF) && (((DWORD)lParam&0x1FF0000) == 0x1260000))))
    {

    CString str = strModulePath;
    str += "\\TFRRPC.exe";
    ::ShellExecute(NULL,"OPEN",str,NULL, strModulePath, SW_SHOW);



    //*/
    return CallNextHookEx(hLLKeyboardHook,nCode,wParam,lParam); 

    }CHookClass::CHookClass()

    hLLKeyboardHook = NULL;
    m_bHooked = FALSE;
    }CHookClass::~CHookClass()
    {

    }BOOL CHookClass::StartHook()
    {
    if(this->m_bHooked) return FALSE; 
    SetKeyboardFilterHook(TRUE);
    this->m_bHooked = TRUE;
    return TRUE;
    }BOOL CHookClass::StopHook()
    {
    if(!this->m_bHooked ) return FALSE;
    SetKeyboardFilterHook(FALSE);
    this->m_bHooked = FALSE; 
    return TRUE;
    }
    // Routine to start and stop local keyboard message filtering
    BOOL CHookClass::SetKeyboardFilterHook(BOOL activate)
    {
    if (activate)
    {
    if (hLLKeyboardHook == NULL)
    {
    // Start up the hook...
    hLLKeyboardHook = ::SetWindowsHookEx(
    WH_KEYBOARD, // Hook in before msg reaches app
    (HOOKPROC) LowLevelKeyboardFilterProc, // Hook procedure
    hInst, // This DLL instance
    0 // Hook in to all apps
    );
    if (hLLKeyboardHook == NULL)
    return FALSE;
    }
    return TRUE;

    else 
    {
    if (hLLKeyboardHook != NULL)
    {
    // Stop the hook...
    if (!::UnhookWindowsHookEx(hLLKeyboardHook))
    return FALSE;
    hLLKeyboardHook = NULL;
    }
    return TRUE;
    }
    }