1. 苏葳的备忘录首页
  2. 编程

剑网3缘起中用硬件模拟键盘和鼠标

AutoHotKey

按键精灵类工具能自动化许多操作,但在许多游戏里却不能使用。要么是游戏的官方运营为了打击自动化脚本,屏蔽了操作系统级的模拟,要么是这些游戏本身使用了directInput之类的输入技术,导致一些常规的按键精灵指令无法使用。比如剑网3缘起,用按键精灵的普通模式输入无效,用“超级模式”可以。用“硬件模拟“方式可能也可以,但它大概是用了winio驱动,必须插上ps/2键鼠才能使用。

那为啥不用鼠标驱动自带的宏功能呢?这当然是最方便的。只是。。。我的华硕大G二代鼠标更新到新版驱动后,这个宏功能过段时间就会莫名失效。在其国外官网上查询,也发现大量反映此问题的贴子。是bug?还是它的驱动跟最新的win11不兼容?无从得知。问客服,只是建议你用回鼠标专用的armoury软件,但这个软件只支持到win10。在win11下并不能正常工作。

所以还是找个可靠的硬件级别模拟按键工具靠谱。搜索到的常用技术如下:

一、winio 这个旧技术了,读写电脑的ps/2端口,可能需要插上ps2键鼠才行。

二、dd_xoft 目前貌似挺流行,但据说需要连网才能使用。否则是收费。

三、backinc 这个也是比较旧的技术。

试验下第二种,也就是DD虚拟键盘虚拟鼠标,在github找到ddxoft的项目:GitHub – ddxoft/master。从项目中下载了zip包,解压缩后,发现例子程序里有cb/c#/delphi/e(易语言?)/java/python/vb.net/vb6/vc等语言的例子,但并没有专用于ahk的脚本库。在drivers目录下有个testself.32/64.exe。用管理员模式启动,点最上面的加载dll按钮,加载drivers下的simple目录下的DD94687.64.dll,然后测试下面那几个按钮,鼠标移动,tab键,输入字母等,貌似确实都可以使用。

由于对autohotkey比较熟,使用体验也比较好。那么有没有autohotkey里的硬件级模拟插件呢?网上找到个现成的ahk调用dd功能的例子:

#Include, Class_DD.ahk
#MaxHotkeysPerInterval 1000

~F4::    
{
    SetTimer, Key01, 20
    return
}

Key01:
    dd.key(502, 1)
    dd.key(502, 2)
return

~F5::
{
    SetTimer, Key01, Off
    return
}

~x::    
{
    SetTimer, Key02, 20
    return
}

Key02:
    dd.key(502, 1)
    dd.key(502, 2)
return

~x UP::
{
    SetTimer, Key02, Off
    return
}

$F12::suspend

看出来,上面代码是ahk 1.x版本的脚本,调用Class_dd.ahk这个包。那么对自己习惯使用的的ahk 2.0有用吗?然后要到哪里找这个class_dd.ahk?

在网上找到个ahk+dd的包,关联到的居然正是剑3魔盒里的文章。这个包在游戏里测试了下,直接就可以使用。可以在魔盒网站搜索这篇文章: 用 AutoHotKey 完成自动化操作 (jx3box.com)。当然,为了安全起见,用的是ahk的1.0.x版,毕竟这算是正式版。而且许多ahk 1.x的包还没有迁移到2.x去呢。

实测鼠标移动点击和按键操作在游戏中都可用。当然稳定性有待验证。

; 看dd的反馈普遍都是低延迟导致蓝屏
; 我在不同电脑用循环60ms发送按键,一台没事,另一台就蓝屏,调到100ms就没事了

#NoEnv
#Include %A_ScriptDir%\Class_DD\class_DD.ahk
SetWorkingDir %A_ScriptDir%

OnExit, Clear

ddxoft := new DD()            ;将类DD实例化
dd.btn(0)                            ;初始化
return

; 调用示例
;DD.str("abc") ;发送文字abc    【有些游戏是用这个函数来发送按键】
;DD._key_press("F11") ;发送键击
;DD._key_pressEx("F11", 2) ;发送键击两次
;DD._key_press("F11", "Up") ;发送F11按下
;DD._key_press("F11", "Down") ;发送F11按下
;DD._key_press("LWin", "R") ;发送组合键Win+R
;DD._key_press("Ctrl", "Alt", "S") ;发送组合键Ctrl+Alt+S
;DD._whl("Up") ;鼠标滚轮向前滚动
;DD._btn("RButtonDown") ;鼠标右键按下    【有些游戏是用这个函数来发送鼠标按键】
;DD._btn("RButtonUp") ;鼠标右键弹起        【有些游戏是用这个函数来发送鼠标按键】
;DD._btn("LButtonDown", 672, 997) ;鼠标左键移动到坐标按下
;DD._btn_press("LButton") ;鼠标左键点击
;DD._btn_press("LButton", 672, 997) ;鼠标左键移动到坐标点击
;DD.mov(10, 10) ;鼠标绝对值移动
;DD.movR(10, 10) ;鼠标相对值移动

Clear:
DD_Helper.UnloadDll()
ExitApp

;下面写脚本内容

;按下F1运行脚本
;$F1::
XButton2::

    loop
    {
    if not GetKeyState("XButton2", "P") ;
    break
;    send {LButton}
    DD._key_press("y")
    Sleep 60

    }

;鼠标移动至坐标点
;DD.mov(155, 291)
;延时1000ms
;Sleep 1000
;鼠标左键在坐标点单击一次
;DD._btn_press("LButton", 510, 671)
;延时1000ms
;Sleep 1000
;发送按键a键点击一次和文字wd
;DD._key_press("y")
;Sleep 60
;DD.str("wd")
;延时1000ms
;Sleep 1000
Return

;按下F3暂停脚本
F3::pause

上面脚本是用 鼠标左侧前键来触发的。但逻辑是按住不动就一直施放。松开停止,如果自己想滚动触发也是可以的。

本打算修改下开用,只是在晚上更新个驱动组件之后,自己的华硕大G二代的鼠标宏貌似又工作正常了。。暂时搁置了。但ahk脚本+DD插件的功能实现应该是非常有用的,可以扩展到许多特殊场景写脚本调用。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/2256.html

发表评论

邮箱地址不会被公开。 必填项已用*标注