关于用键盘低级钩子拦截WIN+E的问题

[复制链接]
查看11 | 回复10 | 2021-1-27 06:01:36 | 显示全部楼层 |阅读模式
我想将WIN+E用于其他目的,所以我写了键盘低级钩子拦截WIN+E来做其他事情,可是无论如何都不成功.当我想退而求其次,仅仅将这个组合键屏蔽的时候.我甚至不能成功的屏蔽这个组合键,资源管理器照常打开.
以下是钩子回调的代码,我试了几种方法:
第一种:
_HookProcproc_dwCode:dword,_wParam:dword,_lParam:dword
local@stKBHook:KBDLLHOOKSTRUCT
invokeRtlMoveMemory,addr@stKBHook,_lParam,sizeofKBDLLHOOKSTRUCT
.if_wParam==WM_KEYDOWN&&@stKBHook.vkCode==VK_E
invokeGetKeyState,VK_LWIN
.ifah==80h
moveax,1
ret
.endif
.endif
invokeCallNextHookEx,hHook,_dwCode,_wParam,_lParam
ret
_HookProcendp
第二种:

_HookProcproc_dwCode:dword,_wParam:dword,_lParam:dword
local@Keyboard[256]:byte
invokeGetKeyboardState,addr@Keyboard
.if_wParam==WM_KEYDOWN&&@Keyboard[VK_E]==1&&@Keyboard[VK_LWIN]==1
moveax,1
ret
.endif
invokeCallNextHookEx,hHook,_dwCode,_wParam,_lParam
ret
_HookProcendp

还有一些其他类似的方法我也试了,就是不行~
望各位为我指出问题所在,谢谢
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
你HOOK成功了吗?
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
这是在kbdus.dll之类里面映射的,具体哪个DLL取决于当前使用的键盘布局。
也可以在注册表里面重新映射,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\KeyboardLayout
里面增加一项scancodemap的hex值。具体方法你搜一下,网上多得很。

回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
引用1楼的回复:你HOOK成功了吗?
还没有,一筹莫展
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
引用2楼的回复:这是在kbdus.dll之类里面映射的,具体哪个DLL取决于当前使用的键盘布局。
也可以在注册表里面重新映射,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\KeyboardLayout
里面增加一项scancodemap的hex值。具体方法你搜一下,网上多得很。

正因为我在网上搜了很多例子来看,我发现他们的做法跟我差不多,思路都是一样的,我觉得这样做不行.所以我才到这里来问问
大哥你把你的方法说具体点吗?因为我才开始学习钩子.哪怕能发一个关于这个东西的文章链接也行,感谢了
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
你是使用setwindowhook这个函数的吧
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
引用4楼的回复:引用2楼的回复:
这是在kbdus.dll之类里面映射的,具体哪个DLL取决于当前使用的键盘布局。
也可以在注册表里面重新映射,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\KeyboardLayout
里面增加一项scancodemap的hex值。具体方法你搜一下,网上多得很。
正因为我在网上搜了很多例子来看……

我在2楼说的方法是写注册表实现屏蔽某些键或者把某些键映射为其他的键,这种方法比较简单,但是需要重新启动系统才能生效。
至于键盘HOOK的方法,ms在文档中说了要检测nCode是否小于0,如果小于0要调用CallNextHookEx,否则可以自己处理。

回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
我认为你应该在LowLevelKeyboardProc中先检测win键,自己维护一个win键状态(按下还是释放),检测到E键时再查看win键状态,不要使用GetKeyState、GetKeyboardState来获取键状态,它们依赖线程的消息处理(线程调用了GetMessage、PeekMessage之后),但是使用GetAsyncKeyState是可以的。

回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
引用5楼的回复:你是使用setwindowhook这个函数的吧
我用的SetWindowsHookEx
回复

使用道具 举报

千问 | 2021-1-27 06:01:36 | 显示全部楼层
引用7楼的回复:我认为你应该在LowLevelKeyboardProc中先检测win键,自己维护一个win键状态(按下还是释放),检测到E键时再查看win键状态,不要使用GetKeyState、GetKeyboardState来获取键状态,它们依赖线程的消息处理(线程调用了GetMessage、PeekMessage之后),但是使用GetAsyncKeyState是可以的。
这个方法我也试,能够实现我需要的功能,但同时也存在两个问题:
1,这种判断方法会有延迟,甚至有时按第一次没反应,按第二次才有。
2,这种方法没办法屏蔽掉原有的win+e的功能,也就是当我按下win+e,会在执行我需要的功能的同时弹出资源管理器.
不过现在我对实现我需要的功能愿望不那么强烈了~~我对windows本身如何实现win+e并有这么迅速的反应倒是很感兴趣
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行