hook键盘钩子后,怎么判断按键是系统的左右哪一个键

 我来答
miniappYoh44tFFDbwZi
2016-04-03 · 请开发者输入账号签名
miniappYoh44tFFDbwZi
采纳数:14074 获赞数:18291

向TA提问 私信TA
展开全部
可以从LPARAM参数中提取出虚拟键值(virtual key),代码片段如下:
C/C++ codePKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
if (wParam == WM_KEYDOWN)
{
char* buf;
char tl[256];
buf = tl;
buf = itoa(p->vkCode,buf,10);//这句是关键
int tmp;
tmp = atoi(buf);
switch (tmp)
{
//......
case VK_LMENU: buf = "<Left MENU>"; break;
//......
}
}
------解决方案--------------------
可以从LPARAM参数中提取出虚拟键值(virtual key),代码片段如下:
C/C++ codePKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
if (wParam == WM_KEYDOWN)
{
char* buf;
char tl[256];
buf = tl;
buf = itoa(p->vkCode,buf,10);//这句是关键
int tmp;
tmp = atoi(buf);
switch (tmp)
{
//......
case VK_LMENU: buf = "<Left MENU>"; break;
//......
}
}
------解决方案--------------------
我在PreTranslateMessage中截获消息,并处理Key值,可以区分开始左边还是右边的按下。
例如左shift还是右shift,但是令我感到奇怪的一点是alt键不是在WM_KEYDOWN中响应,而是在WM_SYSKEYDOWN中响应,而且每按两次才会相应一次,但是区分左右还是没问题的,直接上代码;
C/C++ code在PreTranslateMessage中处理如下代码

BYTE vKeyArrow[256];

switch(pMsg->message)
{
case WM_KEYDOWN:
memset(vKeyArrow,0,256);
GetKeyboardState(vKeyArrow);
if (vKeyArrow[0xa0] == 0x80 || vKeyArrow[0xa0] == 0x81)
TRACE(L"Left shift is down\n");//左Shift键按下
if (vKeyArrow[0xa1] == 0x80 || vKeyArrow[0xa1] == 0x81)
TRACE(L"Right shift is down\n");//右Shift键按下
break;
case WM_SYSKEYDOWN:
memset(vKeyArrow,0,256);
GetKeyboardState(vKeyArrow);
if (vKeyArrow[0xa4] == 0x80 || vKeyArrow[0xa4] == 0x81)
TRACE(L"Left alt is down\n");//左alt键按下
if (vKeyArrow[0xa5] == 0x80 || vKeyArrow[0xa5] == 0x81)
TRACE(L"Right alt is down\n");//右alt键按下
break;
}
------解决方案--------------------
C/C++ codeLRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(HC_ACTION == nCode)
{
KBDLLHOOKSTRUCT* pSturct = (KBDLLHOOKSTRUCT*)lParam;

switch(wParam)
{
case WM_SYSKEYDOWN:
switch(pSturct->vkCode)
{
case VK_LMENU:
AfxMessageBox(_T("Left ALT"));
break;

case VK_RMENU:
AfxMessageBox(_T("Right ALT"));
break;
}
break;

default:
break;
}
}
return CallNextHookEx(hOldHook, nCode, wParam, lParam);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式