Q键连发。按住Q键 则连发。松开则停止2。

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是一样的。但可以判断出真实或模拟。

原文地址:https://www.cnblogs.com/champion8/p/5555549.html