发表回复 
游戏中按键模拟
2016-08-03, 10 : 43
游戏中按键模拟
在尝试模拟一些游戏按键时,发现ahk不太灵光。
如winkawarks模拟器中,设置了上下箭头为移动菜单,在进行移动选择时,发现使用ahk的send也能模拟上下,如
f1::send {down}
但是需要按着不动3~5秒才会向下移动一次;
另外,尝试了keybd_event api函数,发现和ahk的模拟效果相同,并没有强到哪里。如下:
F1::
DllCall("keybd_event",int,38,int,0,int,0,int,0)
DllCall("sleep",Uint,25)
DllCall("keybd_event",int,38,int,0,int,2,int,0)
return
至于红色加粗的0,其实我有个疑问,在ahk键盘记录的为148,而网上百度中键盘扫描码为0x4800,难道ahk的和通用的不同?
此外,关于驱动级的键盘模拟程序似乎还有WinIo,DD,但是不会用,不知哪位研究过,有没有好的解决办法?
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-08-04, 10 : 04
RE: 游戏中按键模拟
扫描码本来就没有通用这个说法,这是厂商设定的,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该就是利用了钩子的, 而且你写的也不是映射 不知道需不需要自动重复 这样改改试试

F1::DllCall("keybd_event",int,38,int,0,int,0,int,0)

F1 up::DllCall("keybd_event",int,38,int,0,int,2,int,0)

还有忘了和你说精确延时得加上这两个Dll
要不然并没有什么用

TimePeriod = 1

DllCall("Winmm\timeBeginPeriod", uint, TimePeriod)
DllCall("Sleep", unit, TimePeriod)
DllCall("Winmm\timeEndPeriod", uint, TimePeriod)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-08-04, 23 : 53
RE: 游戏中按键模拟
(2016-08-04 10 : 04)gxsword 提到:  扫描码本来就没有通用这个说法,这是厂商设定的,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该就是利用了钩子的, 而且你写的也不是映射 不知道需不需要自动重复 这样改改试试

F1::DllCall("keybd_event",int,38,int,0,int,0,int,0)

F1 up::DllCall("keybd_event",int,38,int,0,int,2,int,0)
谢谢,修改后在血战上海滩中成功了;不过在winkawaks模拟器中和功夫熊猫中还是一点也不行。
顺便问下,你会不会用winio这个dll?似乎是驱动级别模拟的,我不知怎么用。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-08-05, 13 : 58
RE: 游戏中按键模拟
这个没用过,不过我有个类似的串口模拟工具,原理应该差不多,感觉不难用,得找找
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-08-08, 10 : 41 (这个帖子最后修改于: 2016-08-08 10 : 44 by gxsword.)
RE: 游戏中按键模拟
(2016-08-04 23 : 53)zhanglei1371 提到:  
(2016-08-04 10 : 04)gxsword 提到:  扫描码本来就没有通用这个说法,这是厂商设定的,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该就是利用了钩子的, 而且你写的也不是映射 不知道需不需要自动重复 这样改改试试

F1::DllCall("keybd_event",int,38,int,0,int,0,int,0)

F1 up::DllCall("keybd_event",int,38,int,0,int,2,int,0)
谢谢,修改后在血战上海滩中成功了;不过在winkawaks模拟器中和功夫熊猫中还是一点也不行。
顺便问下,你会不会用winio这个dll?似乎是驱动级别模拟的,我不知怎么用。

你如果是想要 驱动模拟的话 我这倒是有原来在官网上找的一个现成方案, 用AHK实现了 对IO接口的直接调用 , 注译里写了大概的使用方法 比如 RI_MOUSE_LEFT_BUTTON_DOWN := 0x0001 是鼠标左键按下
II_KBD_VKEY 是按键码 应该好理解
你可以放到LIB 文件夹里 当做本地函数使用 很方便
也可以在脚本里 #Included
先试试把
还有一个 和你说的WinIo是差不多的东西 应该对64位的支持更好
坑爹的是 把帮助不知道 丢哪了 有点麻烦
有兴趣研究一下吧
.7z  WinRing0x32&64.7z (大小: 55.63 KB / 下载: 16)
.rar  AHKHID.rar (大小: 6.7 KB / 下载: 12)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-08-09, 11 : 03
RE: 游戏中按键模拟
(2016-08-08 10 : 41)gxsword 提到:  扫描码本来就没有通用这个说法,这是厂商设定的,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该
能否针对AHKHID给出个以下情况的用法:
按下F1→发送波浪键`
按下F2→发送↑
按下F3→发送↓
按下F4→发送→→(→两次)
看了半天,还是不清楚怎么用。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-09-16, 14 : 06 (这个帖子最后修改于: 2016-09-18 12 : 03 by gxsword.)
RE: 游戏中按键模拟
参考一下这个例子 现成包装好的
脚本加载 好 这个winring0的API脚本就可以用里面的函数了
A := new A()

KeyDown(Key, Keydelay := 10)
KeyUp(Key, Keydelay := 5)
KeyPress(Key)
SendKeys(string, delay)
KeyCombo(arr*)
使用实例;
A.KeyDown("Up")
A.KeyUp("Up")
A.KeyPress("Up") ; 单击一次
A.SendKeys("autohotkey") ;输出字串
A.KeyCombo("Ctrl", "A"); 组合键
用管理员方式运行, 因为一直有点问题弄不好,会重复激发热键, 总算解决了, 官网又无法注册, 还有好像不能发送鼠标,如果有其他问题你最好去官网找原作者版主。
winio现在好像不能用在64位系统, 据说


附件
.txt  Class_WinRing0.txt (大小: 6.58 KB / 下载: 7)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-09-17, 18 : 44
RE: 游戏中按键模拟
(2016-09-16 14 : 06)gxsword 提到:  参考一下这个例子 现成包装好的
脚本加载 好 这个winring0的API脚本就可以用里面的函数了

KeyDown(Key, Keydelay := 10)
KeyUp(Key, Keydelay := 5)
KeyPress(Key)
SendKeys(string, delay)
KeyCombine(arr*)
使用实例;
A.KeyDown("Up")
A.KeyUp("Up")
A.KeyPress("Up") ; 单击一次
A.SendKeys("autohotkey") ;输出字串
A.KeyCombo("Ctrl", "A"); 组合键
用管理员方式运行, 因为一直有点问题弄不好,会重复激发热键, 总算解决了, 官网又无法注册, 还有好像不能发送鼠标,如果有其他问题你最好去官网找原作者版主。
winio现在好像不能用在64位系统, 据说

谢谢,我这样做,没有成功:
将附件中的代码粘贴到ahk脚本中,然后将上面的按键动作用F1来发动,结果发现在记事本中,按了F1,什么反应也没有。不知问题出在哪里。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-09-18, 11 : 59
RE: 游戏中按键模拟
winring0x64.dll
WinRing0x64.sys
放在工作目录
; 根据操作系统选择版本
声明 new 方法
就可以调用了
你要贴你的测试码啊
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-09-18, 14 : 42
RE: 游戏中按键模拟
(2016-09-18 11 : 59)gxsword 提到:  winring0x64.dll
WinRing0x64.sys
放在工作目录
; 根据操作系统选择版本
声明 new 方法
就可以调用了
你要贴你的测试码啊

您看下,我的测试文件。

.rar  测试.rar (大小: 72.97 KB / 下载: 4)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-09-19, 09 : 53
RE: 游戏中按键模拟
(2016-09-18 14 : 42)zhanglei1371 提到:  
(2016-09-18 11 : 59)gxsword 提到:  winring0x64.dll
WinRing0x64.sys
放在工作目录
; 根据操作系统选择版本
声明 new 方法
就可以调用了
你要贴你的测试码啊

您看下,我的测试文件。

给你改了一下
Class_winring0 放脚本 Lib文件夹吧


附件
.txt  测试按键.txt (大小: 7.17 KB / 下载: 9)
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-07-23, 18 : 14 (这个帖子最后修改于: 2017-07-23 18 : 19 by johnsonchiang.)
RE: 游戏中按键模拟
(2016-08-04 10 : 04)gxsword 提到:  扫描码本来就没有通用这个说法,这是厂商设定的,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该就是利用了钩子的, 而且你写的也不是映射 不知道需不需要自动重复 这样改改试试

F1::DllCall("keybd_event",int,38,int,0,int,0,int,0)

F1 up::DllCall("keybd_event",int,38,int,0,int,2,int,0)

还有忘了和你说精确延时得加上这两个Dll
要不然并没有什么用

TimePeriod = 1

DllCall("Winmm\timeBeginPeriod", uint, TimePeriod)
DllCall("Sleep", unit, TimePeriod)
DllCall("Winmm\timeEndPeriod", uint, TimePeriod)
請問一下 這個是加入到寫好的程式碼內還是..?不好意思我有點看不懂
我是用sendplay
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-08-15, 01 : 28
RE: 游戏中按键模拟
(2017-07-23 18 : 14)johnsonchiang 提到:  
(2016-08-04 10 : 04)gxsword 提到:  扫描码是由键盘厂商设定的不一定一样,软件一般不会直接判定这个, 一般来说用来判定一些比较的特殊按键有用。
我看你这个模拟的多是一些老游戏,这些游戏要么就是模拟器或者本身应该就是利用了钩子的, 而且你写的也不是映射 不知道需不需要自动重复 这样改改试试

F1::DllCall("keybd_event",int,38,int,0,int,0,int,0)

F1 up::DllCall("keybd_event",int,38,int,0,int,2,int,0)

还有忘了和你说精确延时得加上这两个Dll
要不然并没有什么用

TimePeriod = 1

DllCall("Winmm\timeBeginPeriod", uint, TimePeriod)
DllCall("Sleep", unit, TimePeriod)
DllCall("Winmm\timeEndPeriod", uint, TimePeriod)
請問一下 這個是加入到寫好的程式碼內還是..?不好意思我有點看不懂
我是用sendplay

sendplay 应该没啥用了, 因为是使用钩子journalcallback重放模拟这个功能 win7以后好像不能用了
以上代码你可以试试用sendinput {vk码sc码} 比如 sendinput {vk41sc01e} ; 等于A键,多数应该可以用
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-08-21, 17 : 46
RE: 游戏中按键模拟
留坑学习!!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合