Hook的使用

#include "stdafx.h"


#pragma data_seg("MY_DATA")
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:MY_DATA,RWS")


HINSTANCE g_hIns = NULL;


//鍵盤鉤子回調函數
LRESULT CALLBACK KeyboardProc(
                              int code,       // hook code
                              WPARAM wParam,  // virtual-key code
                              LPARAM lParam   // keystroke-message information
                              )
{
    if (code < 0)
        return CallNextHookEx(g_hHook, code, wParam, lParam);


    //獲取掃描碼
    UINT uScanCode = (lParam >> 16) & 0xFF;
    
    //獲取鍵盤狀態
    BYTE btKeyState[256] = {0};
    WORD wChar;
    if (::GetKeyboardState(btKeyState))
    {
        //轉換
        char szBuff[MAX_PATH];
        ::ToAscii(wParam, uScanCode, btKeyState, &wChar, 0);
        wsprintf(szBuff, "%c", wChar);
        ::OutputDebugString(szBuff);
    }
    
    return CallNextHookEx(g_hHook, code, wParam, lParam);
}


HHOOK __stdcall SetHook()
{
    if (g_hHook == NULL)
    {
        //調用時機:
        //當GetMessage()且消息類型爲WM_KEYDOWN或WM_KEYUP
        g_hHook = ::SetWindowsHookEx(WH_KEYBOARD,
            KeyboardProc, //全局鉤子回調函數必須放在DLL裏 
            g_hIns, //DLL模塊地址
            NULL    //HOOK所有線程
        );
    }


    return g_hHook;
}


BOOL __stdcall UnSetHook()
{
    if (g_hHook != NULL)
    {
        return ::UnhookWindowsHookEx(g_hHook);
    }
    return FALSE;
}


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
)
{
    g_hIns = (HINSTANCE)hModule;
    return TRUE;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章