WeGame的不好用,自己写了个,有需要的可以参考参考
DNF连发.ahk 代码:
;脚本自检测,如果不是管理员就自动以管理员权限运行自身
if !A_IsAdmin
Run % "*RunAs " (s:=A_IsCompiled ? "" : A_AhkPath " /r ") """" A_ScriptFullPath """" (s ? "" : " /r")
SetWorkingDir %A_ScriptDir% ;要让脚本无条件使用它所在的文件夹作为工作目录,
#NoEnv ;不检查空变量是否为环境变量(建议所有新脚本使用).1.每当表达式或命令中使用空变量时, 这样可以显著提升性能.
#KeyHistory 0 ;设置在 KeyHistory 窗口中显示的键盘和鼠标事件的最大数目. 您可以将其设置为 0 来禁用按键历史.
#MaxThreadsPerHotkey 1
#MaxHotkeysPerInterval 1000
ListLines, Off ;从历史记录中省略随后执行的脚本行.
SetBatchLines, -1 ;让脚本无休眠运行(即让脚本以全速运行).
Process Priority, , High
#SingleInstance force
key1Arr:=[],key1text:="",zt=0 ;用来存放连发按键的数组,zt变量用来控制脚本的暂停功能
global duration := 100
global delay := 2
global processes = {} ;空对象processes,在下面使用成一个关联数组
pidarr:=[] ;初始化连发进程数组
;=======================第1套连发GUI=====================
Gui, Color, D9ECFF
Gui, Add, Text,y9 vt1, 添加连发键:
Gui, Add, Text,h100 vtt1, 当前连发方案:
Gui, Add, Button, Default w80 g清空标签 , 清空设置
Gui, Add, Hotkey,w110 vkey1 ym ;添加按键编辑框。ym 选项开始一个新的控件列.热键变量keyt1
gui, font, cBlue Bold s12 ;cBlue字体蓝色,S: 字体大小,bold标准字体
Gui, Add, Text,w140 h20 xp yp+140 vttF12, 暂停快捷键F12:
gui, font ;清除控件设置字体字型, 大小, 样式和/或颜色.
Gui, Add, Button, Default w80 g添加标签 ym, 添加
Gui, Add, Text,h100 w200 xp-150 yp+30 R5 Wrap vkey1text,添加按键编辑框。ym 选项开始一个新的控件列.热键变量keyt1 ;按键的提示内容,变量key1text
gui, font, cBlue Bold s12
Gui, Add, Text,w110 xp+120 yp+110 vzttext2,状态:运行中
gui, font
Gui, Show,, 按键连发程序
Gui, +AlwaysOnTop ;让窗口置顶
Gui, -AlwaysOnTop ;取消窗口置顶
;===================加载连发设置======================
iniarr :=IniReadkey("连发设置.ini", "连发设置")
For K, key in iniarr { ;遍历数组iniArr
key1Arr.push(key)
}
;===修改按键的提示内容,将已设置的按键追加到提示内容中
key1text:="当前已设置的连发按键:"
For _, value in key1Arr
key1text := key1text value ;拼接字符串
GuiControl, Text, key1text, %key1text% ;更改控件的文本/标题.
;===创建设置好的按键作为热键,并建立连发程序
if (pidarr !=""){ ;检测是否残留了旧的连发进程
for _, pids in pidarr
Process, Close, % pids ;强制关闭第一个匹配进程.
pidarr:=[] ;初始化连发进程数组
}
For K, key in key1Arr { ;遍历数组key1Arr,将值作为参数,运行外部程序 targetScriptPath ,并传入参数key
Run, "%A_AhkPath%" /f "autofire.ahk" "%key%", , , pid ;/f 无条件强制启动, 忽略任何警告对话框.A_AhkPath实际运行当前脚本的 EXE 文件的完整路径和名称.
pidarr.push(pid)
}
OnExit, PidClose ;指定一个在脚本退出时自动运行的回调函数或子程序.这里能关闭后台进程
return ; 自动运行段结束. 在用户进行操作前脚本会一直保持空闲状态.
;======点击添加按钮时运行g标签“添加标签”===============
添加标签:
Gui, Submit,NoHide ; 保存用户的输入到每个控件的关联变量中.
;将连发键保存到数组key1Arr[]中
If (key1 !=""){ ;key1不为空时将其值追加保存到数组key1Arr[]中
For k, v in key1Arr { ;遍历数组key1Arr,检查是否已有当前设置的按键,
if(key1 = v) { ;key1与数组中的值相同时,报错
MsgBox 已设置此按键,无需再设
Return
}
}
key1Arr.Push(key1) ;key1不为空时将其值追加保存到关联数组key1Arr中,键为key1,值也为key1
}
Else { ;key1为空时报错
MsgBox 添加的按键为空,请重新操作
Return
}
;===修改按键的提示内容,将已设置的按键追加到提示内容中
key1text:="当前已设置的连发按键:"
For _, value in key1Arr
key1text := key1text value ;拼接字符串
GuiControl, Text, key1text, %key1text% ;更改控件的文本/标题.
;===创建设置好的按键作为热键,并建立连发程序
if (pidarr !=""){ ;检测是否残留了旧的连发进程
for _, pids in pidarr
Process, Close, % pids ;强制关闭第一个匹配进程.
pidarr:=[] ;初始化连发进程数组
}
IniDelete, 连发设置.ini, 连发设置 ;删除连发设置.ini中的连发设置,即初始化
For K, key in key1Arr { ;遍历数组key1Arr,将值作为参数,运行外部程序 targetScriptPath ,并传入参数key
Run, "%A_AhkPath%" /f "autofire.ahk" "%key%", , , pid ;/f 无条件强制启动, 忽略任何警告对话框.A_AhkPath实际运行当前脚本的 EXE 文件的完整路径和名称.
pidarr.push(pid)
IniWrite, %key%, 连发设置.ini, 连发设置, %key% ;写入到ini文件保存连发的设置,如X=X,便于下次启动直接加载
}
;ListHotkeys ;显示所有热键
return
清空标签:
if (key1arr != "") {
IniDelete, 连发设置.ini, 连发设置 ;删除连发设置.ini中的连发设置,即初始化
key1arr := []
if (pidarr !=""){ ;检测是否残留了旧的连发进程
for _, pids in pidarr
Process, Close, % pids ;强制关闭第一个匹配进程.
pidarr:=[] ;初始化连发进程数组
}
ToolTip ,已清空设置
SetTimer, RemoveToolTip, -2000 ;2秒后关闭ToolTip
;===修改按键的提示内容,将已设置的按键追加到提示内容中
key1text:="当前已设置的连发按键:"
For _, value in key1Arr
key1text := key1text value ;拼接字符串
GuiControl, Text, key1text, %key1text% ;更改控件的文本/标题.
}
Else {
ToolTip ,已清空设置,不用再操作了
SetTimer, RemoveToolTip, -2000 ;2秒后关闭ToolTip
}
Return
F12:: ;挂起所以热键,并提示
suspend Permit ;避免自身F12被挂起
{
if (zt=0){
zt:=1
GuiControl, Text, zttext2, 状态:已暂停
Gui, Font, cRed Bold s12 ; 如果需要, 使用这样的一行给窗口设置新的默认字体.
GuiControl, Font, zttext2 ; 让上面的字体设置对控件生效
suspend On ;挂起所有的热键和热字串, 备注部分说明的除外.
ToolTip ,连发暂停啦
SetTimer, RemoveToolTip, -2000 ;2秒后关闭ToolTip
}
else{
zt:=0
GuiControl, Text, zttext2, 状态:运行中
Gui, Font, cBlue Bold s12 ; 如果需要, 使用这样的一行给窗口设置新的默认字体.
GuiControl, Font, zttext2 ; 让上面的字体设置对控件生效
suspend Off ;重新启用上面禁用的热键和热字串.
ToolTip ,连发又开启啦
SetTimer, RemoveToolTip, -2000 ;2秒后关闭ToolTip
}
}
Return
!F12::
GuiClose:
if (pidarr !=""){ ;检测是否残留了旧的连发进程
for _, pids in pidarr ;遍历后关闭所有旧的连发进程
Process, Close, % pids ;强制关闭第一个匹配进程.
pidarr:=[] ;初始化连发进程数组
}
ExitApp ;ALT+F12退出脚本
PidClose: ;这里能关闭后台进程
if (pidarr !=""){ ;检测是否残留了旧的连发进程
for _, pids in pidarr ;遍历后关闭所有旧的连发进程
Process, Close, % pids ;强制关闭第一个匹配进程.
pidarr:=[] ;初始化连发进程数组
}
ExitApp ;ALT+F12退出脚本
;===============以下为相关函数=======================
;=====解析ini文件段落中的键和值,返回的是保存成键值对的关联数组
;例:arr:=IniReadkey(Filename, Section)
IniReadkey(Filename, Section){ ;Filename为ini文件名, Section为段名。解析ini文件段落中的键和值,并将键值对保存为关联数组返回
IniRead initxt, %Filename%,%Section% ;读取%Filename%ini文件中,%Section%段的整段的值,保存在变量initxt
initxt := StrReplace(initxt, "`n", "=") ;用=替换字符串中initxt的换行`n
initxt_array := StrSplit(initxt, "=") ;以=为分隔符将字符串拆分成多个字符串并保存在数组initxt_array中
brr:={}
for k, v in initxt_array {
if (Mod(k, 2) = 0){ ;取余Mod(k, 2) ;返回 k 除以 2 之后的余数.
ObjRawSet(brr,initxt_array[k-1], initxt_array[k]) ;存储或覆盖对象中的一组键值对.
}
}
Return brr
}
RemoveToolTip: ;关闭ToolTip
ToolTip
return
autofire.ahk 代码:
; ==================== 说明开始 ====================
; 这个脚本接收一个形如 "a" 的参数, 并开启按键的连发
; ==================== 说明结束 ====================
#NoEnv ;不检查空变量
#NoTrayIcon ;不显示托盘图标.
SetWorkingDir .. ;要让脚本无条件使用它所在的文件夹作为工作目录, 请在脚本首行中使用下列语句:
arg_1 = %1% ;向脚本传递命令行参数的第一个参数被储存在变量%1%中,这里提取了传入的第一个参数
key := arg_1 ;将第一个参数赋值给变量key
if (key != "") { ;key不为空时,运行函数SetAutofire(key)
SetAutofire(key)
}
Return
SetAutofire(key) { ;创建热键,并指定热键执行函数
;Hotkey, IfWinActive, ahk_exe DNF.exe ;上下文相关的热键,Hotkey, IfWinActive以下生成的热键只在DNF.exe中有效
keycode := GetgameKeycode(key) ; 提前算好 keycode, 以提高连发的速度
fn := Func("OnSelSendKey").Bind(key, keycode) ;表示可以被脚本调用的自定义或内置的函数. Func 返回这种类型的对象.
Hotkey, $~*%key%, %fn% ;;创建热键key,并指定热键执行函数fn对象
; ListHotkeys
;Hotkey, If ;关闭上下文相关的热键,Hotkey, If
}
;===============以下为相关函数=======================
GetgameKeycode(key) { ; 返回对应于 key 的只被游戏识别但不影响打字的 keycode,有些游戏可能不适用,DNF测试可行
base := "vkFFsc"
sc := GetKeySC(key) ;返回按键的扫描码
keycode := Format("{1}{2:X}", base, sc) ;Format根据格式字串的定义, 将若干个输入值格式化为指定格式.这里相当于base, 与sc的十六进制相互拼接
return keycode
}
OnSelSendKey(key, keycode) { ;自我重复激发按键函数
while (getKeyState(key, "P")) { ;检测到按键key按下时
RobustSend(keycode)
}
}
RobustSend(keycode) { ;这里发送按键码更为快速
; 或许用 SetKeyDelay 也可以达成同样的效果
Random, duration , 10, 30
Random, delay , 20, 40
Send, {Blind}{%keycode% down} ;好像发不出按键,有延时就行?
Sleep, duration ;持续时间
Send, {Blind}{%keycode% up}
Sleep, delay ;延迟
}
帧数低打团好使不?wg的倒没用,用的是游戏内自带的连发设置,不过在打团时那连发也不好使