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;
}
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.