键位映射问题(修改键盘键位)

waitling23 2008-09-29 07:00:52
功能就像一般的改键工具一样,比如在按下"A"键时实现"B"键的功能。
我尝试用钩子来获得了按下的键值,然后用keybd_event来实现替换键的功能:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{

if (wParam== '1')
{
keybd_event('2', 0, 0, 0);keybd_event('2', 0, KEYEVENTF_KEYUP, 0);
}
}

LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
但是运行时我发现在按下“1”键的时候,输出的是"12",我想知道怎么屏蔽掉原键的消息。如果直接return TRUE 的话就会屏蔽掉所有按键。
...全文
312 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joephia 2008-09-30
  • 打赏
  • 举报
回复

个人觉得

首先你要判断哪些是转换过的按键,

哪些是自然产生的按键,

否则只能屏蔽某些键,而不能达到按键重排的效果
waitling23 2008-09-30
  • 打赏
  • 举报
回复
还是不行,如果直接return TRUE 的话,就不会输出2了。
cnzdgs 2008-09-30
  • 打赏
  • 举报
回复
主要原因是你没有处理键的UP事件。
waitling23 2008-09-30
  • 打赏
  • 举报
回复
恩,很感谢cnzdgs 的帮助,确实可以达到效果。
能告诉我原因吗?再次感谢!
cnzdgs 2008-09-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 waitling23 的回复:]
还是不行,如果直接return TRUE 的话,就不会输出2了。
[/Quote]
我在6楼给的代码你试过了吗?结果是什么样?
greatws 2008-09-29
  • 打赏
  • 举报
回复
你发送完毕就直接return TRUE,打断消息链,继续传递的话当然是2个键咯
cnzdgs 2008-09-29
  • 打赏
  • 举报
回复
这样试试:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode >= 0 && wParam == '1')
{
DWORD flags = 0;
if ((DWORD)lParam & 0x80000000))
flags = KEYEVENTF_KEYUP;
keybd_event('2', 0, flags, 0);
return TRUE;
}
return CallNextHookEx(hkb, nCode, wParam, lParam);
}
wltg2001 2008-09-29
  • 打赏
  • 举报
回复
钩子里面直接修改键码,也就是消息参数,不用再发送。
======================
好像不行吧,以前论坛好像讨论过这个问题
菜牛 2008-09-29
  • 打赏
  • 举报
回复
钩子里面直接修改键码,也就是消息参数,不用再发送。
waitling23 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 season030441 的回复:]
试一试截获按键消息之后,不再向下传递,然后自己发送KeyDown消息,并把附加参数设定为键盘码
[/Quote]
说的是sendMessage吗,似乎还是没用。

楼上的方法依然会输出‘12’来!
sokewoniu 2008-09-29
  • 打赏
  • 举报
回复
不知道这样行不行?


LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{

if (wParam== '1')
{
keybd_event('2', 0, 0, 0);
keybd_event('2', 0, KEYEVENTF_KEYUP, 0);
return TRUE;
}
}

LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
season030441 2008-09-29
  • 打赏
  • 举报
回复
试一试截获按键消息之后,不再向下传递,然后自己发送KeyDown消息,并把附加参数设定为键盘码

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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