WH_KEYBOARDのフックプロシージャサンプル
Posted on Sun 07 March 2010 in Windows
キーボードが押されてない状態から押された状態へ遷移した時と、押している状態から、押されていない状態へ遷移した時に、押されたキーの仮想コード、shift、ctrl、altのそれぞれの状態を表示するフックプロシージャのコード
WH_KEYBORDのフックプロシージャは、0を返すと他のフックプシージャやウィンドウメッセージを処理するウィンドウへメッセージを渡し、0以外を返すとメッセージを渡さない。
LRESULT KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(m_hHook, nCode, wParam, lParam);
::OutputDebugString("keyboard hook! ");
if((lParam & 0xc0000000) == 0xc0000000){
UINT optChar = 0;
//check keyup shift
if(::GetKeyState(VK_SHIFT) >= 0){
::OutputDebugString("shift ");
}
//check keyup ctrl
if(::GetKeyState(VK_CONTROL) >= 0){
::OutputDebugString("ctrl ");
}
//check keydup alt
if(!(lParam & 20000000)){
::OutputDebugString("alt ");
}
UINT code = wParam;
char log[64];
wsprintf(log, "%d up\n", code);
::OutputDebugString(log);
}
else if((lParam & 0xc0000000) == 0x00000000){
UINT optChar = 0;
//check keydown shift
if(::GetKeyState(VK_SHIFT) < 0){
::OutputDebugString("shift ");
}
//check keydown ctrl
if(::GetKeyState(VK_CONTROL) < 0){
::OutputDebugString("ctrl ");
}
//check keydown alt
if(lParam & 0x20000000){
::OutputDebugString("alt ");
}
UINT code = wParam;
char log[64];
wsprintf(log, "%d down\n", c);
::OutputDebugString(log);
}
return TRUE;
}