问题描述
我正在寻找为c ++项目编写键盘钩子。我找到了一些代码,但是不想在不完全理解的情况下使用它:
HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int ncode,WParaM wParam,LParaM lparam)
{
if(ncode>=HC_ACTION)
{
if((wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN))
{
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
DWORD dwMsg = 1;
dwMsg += kbdStruct.scanCode << 16;
dwMsg += kbdStruct.flags << 24;
char key[16];
GetKeyNameText(dwMsg,key,15);
if((GetKeyNameState(VK_CAPITAL)& 0x0001) == 0)
{
for (int i=0; i<10)key[i] = tolower(key[i]);
ReturnKeypressed(key);
}
else
{
ReturnKeypressed(key);
}
}
}
return CallNextHookEx(_hook,nCode,wParam,lParam);
}
void SetHook()
{
_hook = SetwindowsHookEx(WH__KEYBOARD_LL,HookCallback,Null,0);
}
我不明白这里的nCode。其他参数从何而来? 来自绝对C ++初学者的问候:)。
解决方法
简而言之,nCode
告诉您wParam
和lParam
是否包含有效数据。如果nCode
为HC_ACTION
(0),则它们为{否则,则不是。 the documentation中明确指出了这一点:
nCode [in]
类型:int
挂钩过程用来确定如何处理消息的代码。 如果 nCode 小于零,则挂钩过程必须将消息传递给
CallNextHookEx
函数,而无需进一步处理,并且应返回{{1}返回的值}。此参数可以是下列值之一。HC_ACTION
0
CallNextHookEx
和wParam
参数包含有关键盘消息的信息。wParam [in]
类型:lParam
键盘消息的标识符。此参数可以是以下消息之一:
WM_KEYDOWN
,WM_KEYUP
,WM_SYSKEYDOWN
或WM_SYSKEYUP
。lParam [in]
类型:WPARAM
指向
KBDLLHOOKSTRUCT
结构的指针。