键盘钩子,如何 将 Shift、Ctrl键 修改为 小键盘数字键?

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

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

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

应该怎么做?
哪位高手,可以稍微指点一下?
...全文
695 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyskytoday 2009-04-28
  • 打赏
  • 举报
回复
楼主,现在我帮不了你,但可以帮你顶。。。。


还有,对你的ID非常好奇
这个帖子能给出200分,厉害
---------------------
等级:
可用分等级:短工
总技术分:0
总技术分排名:3000000
结帖率:0.00%
gyk120 2009-04-28
  • 打赏
  • 举报
回复
说几个键和其他键不一样,我觉得不大可能,因为虚拟扫描码也就那个数,实在不明白究竟有什么不同,进程有特权,难道键盘也有?至少我没听说过……
2L的思路应该可行,因为以前有人写过HotKey屏蔽Win键,也没见到用什么过滤驱动之类的东西
maple_zhj 2009-04-28
  • 打赏
  • 举报
回复
我再顶一下,就没人再给点建议了?
maple_zhj 2009-04-28
  • 打赏
  • 举报
回复
没有满意的答复,
随便散分了。
zouyourou 2009-04-28
  • 打赏
  • 举报
回复
去vckbase找找看答案吧。
zouyourou 2009-04-28
  • 打赏
  • 举报
回复
VOID keybd_event( BYTE bVk,
BYTE bScan,
DWORD dwFlags,
PTR dwExtraInfo
);
捕鲸叉 2009-04-28
  • 打赏
  • 举报
回复
VOID keybd_event( BYTE bVk,
BYTE bScan,
DWORD dwFlags,
PTR dwExtraInfo
);
maple_zhj 2009-04-28
  • 打赏
  • 举报
回复
To 9楼:

Shift、Ctrl、Alt 功能,

如果在 KeyDown 和KeyUp 之间 将 键盘Shift消息改成字母, 字母大写变小写,小写则变大写。

如果是改成 数字,就不输出了, 变成组合键了。

可见,Shift 还有一部分组合 ,没有被拔掉。



To 10楼:

有什么可好奇的,分本来就是用来分给别人的。
至于这个ID,我是用了好几年了。


maple_zhj 2009-04-27
  • 打赏
  • 举报
回复
还有人要补充的吗?
分加到200。
maple_zhj 2009-04-27
  • 打赏
  • 举报
回复
嗯,那先谢谢你的提供的思路 ,
我再尝试一下,如果不行,
就做过滤驱动了。
cnzdgs 2009-04-26
  • 打赏
  • 举报
回复
回复帖子只是提些参考意见,如果LZ觉得可行,就按回复的内容去做,如果觉得没有参考价值,无视即可。我回复过的帖子90%以上是自己没有验证过的,答错的时候也常有。
maple_zhj 2009-04-26
  • 打赏
  • 举报
回复
WH_KEYBOARD_LL 键盘钩子,可以做到?
你确定?

有人说是,必须做 驱动过滤 ,

因为Shift、Ctrl、Alt、Win键 跟普通的键不一样
cnzdgs 2009-04-24
  • 打赏
  • 举报
回复
系统中是要记录Shift、Ctrl等键的状态的,单修改消息达不到目的,可以改成WH_KEYBOARD_LL钩子,用keybd_event来模拟键盘输入。
  • 打赏
  • 举报
回复
楼主,是修改魔兽快捷键吗?
直接在文件里设置就好啊.
zzz822163 2009-04-24
  • 打赏
  • 举报
回复
三个消息,WM_KEYDOWN,WM_CHAR,WM_KEYUP都改了吗,你怎么做的?
又一个delphi钩子用法及代码,可以截获几乎所有值,例如:shift ?,ctrl ?,alt ?,F1~F12,shift或者ctrl或者alt F1~F12,单独的 shiftctrl、alt 值,特殊ins、del、caps lock、num lock、数字 等等,你只要稍作修改,也可以截获 ctrl alt ?等值,没有截获不到的值,本程序不使用dll方式,使用常规方式,方便你编译调试修改,支持xp、vista、win7,是最强悍的钩子控件, 在delphi7下通过。   myshiftchar:string;//返回shift状态 例如 ctrl   mypresschar:string;//返回整个值 例如 ctrl g   dulictrl:string;//返回 ctrl 和 alt 单独状态, =ctrl or =alt   安装方法:   本控件的核心源代码在 unit2   首先 创建调用主窗体,假定是form1,在form1上放一个 memo控件(必须),然后创建一个新单元 如unit2,把我的unit2 单元的源代码全部复制过去,做以下修改,首先确保form1使用 新单元 如unit2,并且unit2也使用form1。   在新单元unit2中 ,找到 函数 function KeyBHkHandle 过程,在其中找到以下两条语句:    // 在这里根据自己的情况修改    form1.Memo1.Lines.Add(mypresschar);   // 在这里根据自己的情况修改    if mypresschar'' then form1.Memo1.Lines.Add(mypresschar);   如果你的调用主窗体就叫form1,则不用修改,否则把这两条语句的form1修改为你的调用主窗体的名字。   在 memo编辑框的onChange事件中编写自己的 消息接受主控制过程,其中 字符串mypresschar 返回总值,它跟memo编辑框中显示值是一样的 ,例如 g、shift g、ctrl 2、F9、alt F9、 等等,其中 字符串shiftstr 返回 控制 shift ctrl alt 的状态,例如按下ctrl,则 shiftstr=‘ctrl’ ,否则=''。   最后不要忘记在程序退出时卸载钩子
压缩包里面有1.2和1.3两个版本,1.3较之1.2主要是快捷功能菜单项有所增加,另外个人感觉1.3滚轮缩放功能不如1.2流畅,还是推荐使用1.2版本。 程序exe文件放其他地方运行也行,不过程序所带的快捷功能菜单估计用不了~~~ exe文件会被杀软报木马病毒,添加信任列表即可。 -------------------- 这个软件主要是利用了MAPGIS本身的功能,以及一些快捷方式! 再利用钩子,映射到鼠标上。 再通过其它算法(可以不用,只不过会很憋拗)达到更好的效果! 并没有对MAPGIS本身做任何改动!所以不会影响MAPGIS的稳定性! 使用过程中关闭本程序也不会有任何问题! (关闭后功能也就鼠标滚轮和快捷方式不能用而已) 当然程序启动后你也可以再打开一个MAPGIS编辑子系统窗口, 同样可以使用鼠标滚轮和快捷方式! -------------------- 软件使用说明: 鼠标滚轮:以鼠标光标为中心放大缩小 鼠标中: 手形移动窗口 在绘图窗口敲 [Space]空格 或者 双击[鼠标右](1.3版本)打开快捷功能菜单 ---------以下的功能要在画线或弧段时才有效(以下实际上是MAPGIS本身的功能)--------- 按住[鼠标右]单击[鼠标左]:靠近线或弧段(不加点) ------新功能 按住[鼠标右]单击[鼠标中]:封闭线或弧段 ------新功能 按住[鼠标右]向前推[鼠标滚轮]:锁定线或弧段的折点 ------新功能 按住[鼠标右]向后拨[鼠标滚轮]:画线或画弧段时退点 ------新功能 [E] 窗口中心跳到光标处 [5]数字 更新窗口 [6]数字 返回上级窗口 [R] 画线或画弧段时退点 [W] 调转线或弧段方向 [F] 靠近线或弧段(加点) [D] 靠近线或弧段(不加点) [S] 锁定线或弧段的中点 [A] 锁定线或弧段的头或尾 [Shift] 锁定线或弧段的折点 [Ctrl] + [鼠标右] 封闭线或弧段 [Ctrl]+[Enter]暂停或启动本程序

15,473

社区成员

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

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