Q键连发。按住Q键 则连发。松开则停止2。
用软件模拟可以做到。
挂低级键盘钩子,判断按键的来源。
能判断出是真实键盘按键,还是模拟按键,则就可以做了。
拦截真实按键,放行模拟按键。
驱动级的就无法判断了。
指狗为鸡。
//
哪个API,能判断出真实按键/模拟按键?
//
setwindowshookex,在回调函数里可以判断真实按键还是软件模拟。有些游戏就是靠这方法屏蔽模拟按键的
指狗为鸡 14:18
//
按键精灵的
普通模拟,你HOOK哪个函数。
超级模拟,HOOK哪个函数?
剑仙十号 15:28
//
低级键盘钩子,wh_keyboard_ll,(13)
当然这只能判断是不是软件模拟,硬件戓超级是无法判断的
指狗为鸡 15:52
2楼. 全局键盘钩子,回调函 数的参数3,是结构体。
可以先写成整数型。
我们来看看该结构在MSDN中的解释
//
Public Structure KeyboardHookStruct
Dim vkCode As Integer
Dim ScanCode As Integer
Dim Flags As Integer
Dim Time As Integer
Dim DwExtraInfo As Integer
End Structure
//
其中各个参数意义如下:
VkCode:按键的虚拟键码。键盘上的每个按键对应一个虚拟键码
ScanCode:硬件的扫描码
Flags:按键消息的详细信息。是一些标识位的组合
Time:时间。
DwExtraInfo:扩展到按键消息的信息
3楼. 结构体的成员3,Flags
是一个八位的二进制,各个位的标识信息如下:
从右到左数起。
0位:扩展键的标识位。
1表示该键是扩展键;0表示不是。
1位~3位:保留位,一般为0。
4位:消息类型的标识位。
1表示消息是模拟的;0表示消息是真实的。
5位:Alt键的标识位。
1表示Alt是按住的;0表示Alt键没有被按下
6位:保留位,一般是0
7位:按键的状态标识位。1表示按键是弹起的,0表示按键是按住的
在易里面,二进制数都做成 十进制数。
二进制 10000,十进制是16。16就表示按键消息是模拟的。
if(键盘.Flags==16)
traceprint("模拟按键。")
//
Flags参数的第四位,能区分消息的类别。
当使用物理键盘,是真实的按键消息,这位是0;
当用keybd_event函数,模拟按键消息时,这个进制位是1。
4楼. 调用API函数RtlMoveMemory,,
把回调函数,参数3的数据,复制到定义好的结构体中。
.
复制之前,,参数3的数据是在内存中的。
//
在定义RtlMoveMemory这个dll前,先要定义一个结构体1。
vkCode 整数型
ScanCode 整数型
Flags 整数型
Time 整数型
DwExtraInfo 整数型
//
定义RtlMoveMemory这个dll。
查询MSDN,参数1是结构体指针。
参数1的数据类型,定义为上一步的结构体1。勾选传址。
//
在程序集窗口,先定义一个局部变量。键盘
调用API函数RtlMoveMemory,,
把回调函数,参数3的数据,复制到定义好的结构体中。
.
复制之前,,参数3的数据是在内存中的。
5楼. 之后在回调函数中,判断键盘.Flags 的值就好了。
键盘.Flags = 0 //真实按键。拦 截。
键盘.Flags = 16//二进制数是 10000,模拟按键。放行。
剑仙十号 5-22 16:45 回复
6楼. 之后在回调函数中,
if(键盘.VkCode==81 && 键盘.Flags = 0)
traceprint("Q键。真实按住。")
//拦截。
发送Q键的模拟按键。
返回(1)
end
.
.
前台真实按键的API,和前台模拟按键的API是一样的。但可以判断出真实或模拟。