键盘钩子,如何正常 修改 Shift键 为 数字键或者小键盘Numpad键?

maple_zhj 2009-04-21 10:06:59
我做了一个 系统键盘钩子:
// 注册系统钩子 --- 用于 修改 按键
Hook_setting = (HHOOK)SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)LauncherHook_setting,
theApp.m_hInstance,
0);

然后是改键的回调函数:
LRESULT CALLBACK LauncherHook_setting(int nCode, WPARAM wParam, LPARAM lParam)
{

if(nCode == HC_ACTION)
{
PMSG pMsg = (PMSG) lParam;
if( (pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_KEYUP) )
{


//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//虚拟键位 --- 区分 左Shift 和 右Shift
if(pMsg->wParam == VK_SHIFT)
{
// 检查是否 LSHIFT 键被按下
if (GetKeyState(VK_LSHIFT)>>( (sizeof(SHORT) * 8 ) - 1 ))
pMsg->wParam = VK_LSHIFT;
else
pMsg->wParam = VK_RSHIFT;
}

//虚拟键位 --- 区分 左Control 和 右Control
if(pMsg->wParam == VK_CONTROL)
{
// 检查是否 LControl 键被按下
if (GetKeyState(VK_LCONTROL)>>( (sizeof(SHORT) * 8 ) - 1 ))
pMsg->wParam = VK_LCONTROL;
else
pMsg->wParam = VK_RCONTROL;
}
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


for(int i=1; i<=DLL_setting_No; i++)
//如果当前值 等于 取代的按键 Change
if( ( (PMSG)lParam )->wParam == DLL_set_Change[i] )
{
// 键盘消息变为 取代的初始按键 Init
( ((PMSG)lParam)->wParam ) = DLL_set_Init[i];

// 修改后,马上跳出循环,防止被二次修改
break;
}
}
}

// 让其它全局钩子获得消息
return CallNextHookEx(Hook_setting, nCode, wParam, lParam);

}

问题是:
我用 左Shift、右Shift、左Ctrl、右Ctrl 来代替其它键位时,
会出问题, 比如 修改了 Shift为 小键盘Num1时,不输出,
而 修改了 Shift为 普通数字1时,输出为 !(应该是被识别为Shift+1了)。

如果我要让 修改Shift为 小键盘Num1时,正常输出Num1;
修改Shift为 普通数字1时,正常输出 1;

应该怎么做?
哪位高手,可以稍微指点一下?
...全文
721 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
maple_zhj 2009-04-24
  • 打赏
  • 举报
回复
算了,结帖了。没人回答。
maple_zhj 2009-04-23
  • 打赏
  • 举报
回复
最后顶一次,没人就结了。
maple_zhj 2009-04-21
  • 打赏
  • 举报
回复
是不是没有分,就没人回答了?

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧