新武林外传吧 关注:55,289贴子:1,158,375
  • 0回复贴,共1页

刚回归 配合请神谢了个按键小助手

取消只看楼主收藏回复

代码分享 只能 调整tab快速选怪 可以配置多设置技能 我是单刷配合请神用的 不能识别加血 需要自己选择游戏当前句柄
; ============================================================
; MultiHotkey.ahk - 后台连发工具 (无弹窗版)
; 功能:16行并行发送,锁定目标并激活窗口,无确认弹窗
; 运行要求:管理员权限,AHK v2.0+
; ============================================================
#Warn
#SingleInstance Force
#Requires AutoHotkey v2
SetTitleMatchMode 2
DetectHiddenWindows false
SetWorkingDir A_ScriptDir
SendMode "Input"
; ----- 管理员权限检查 -----
if !A_IsAdmin {
try Run("*RunAs " A_ScriptFullPath)
catch {
MsgBox("需要管理员权限才能运行")
}
ExitApp()
}
; ----- 全局变量 -----
TargetHwnd := 0
WinList := Map()
KeyRows := Map()
IsRunning := false
hwndDropDown := ""
RefreshBtn := ""
MainGui := ""
DdlItemCount := 0
LockAndActivate := false ; 是否锁定并激活窗口
KeyOptionList := ["无", "Tab", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
; ===== 创建一行设置 =====
CreateKeyRow(Gui, x, y) {
global KeyOptionList
row := {Controls: Map(), Run: false, TimerFunc: "", KeyName: ""}
keyDDL := Gui.Add("DropDownList", "x" x " y" y " w70", KeyOptionList)
keyDDL.OnEvent("Change", KeyDDLChangeEvent.Bind(row))
row.Controls.Set("KeyDDL", keyDDL)
Gui.Add("Text", "x" (x+78) " y" y, "间隔:")
delayEdit := Gui.Add("Edit", "x" (x+115) " y" y " w50", "1.0") ; 默认间隔 1 秒
row.Controls.Set("Delay", delayEdit)
return row
}
KeyDDLChangeEvent(row, *) {
keyDDL := row.Controls.Get("KeyDDL")
text := keyDDL.Text
row.KeyName := (text = "无") ? "" : text
}
; ===== 刷新窗口句柄列表 =====
RefreshHwndList(*) {
global WinList, hwndDropDown, TargetHwnd, DdlItemCount
local wList := [], cnt := 0, idx := 0, hWndVal := 0, wTitle := "", dText := "", firstKey := ""
; 如果已锁定,则不允许刷新
if LockAndActivate {
return
}
WinList := Map()
Loop DdlItemCount {
hwndDropDown.Delete(1)
}
DdlItemCount := 0
wList := WinGetList()
cnt := 0
for idx, hWndVal in wList {
if hWndVal = A_ScriptHwnd
continue
wTitle := WinGetTitle("ahk_id " hWndVal)
if !wTitle || StrLen(wTitle) > 50
continue
cnt += 1
dText := "句柄" cnt " " wTitle
WinList[dText] := hWndVal
hwndDropDown.Add([dText])
DdlItemCount += 1
}
if WinList.Count > 0 {
hwndDropDown.Value := 1
for firstKey in WinList {
TargetHwnd := WinList[firstKey]
break
}
} else {
hwndDropDown.Value := ""
TargetHwnd := 0
}
}
OnHwndSelect(*) {
global WinList, hwndDropDown, TargetHwnd
local selectedIdx := 0, selectedText := "", hWndVal := 0
; 如果已锁定,则不允许更改选择
if LockAndActivate {
return
}
selectedIdx := hwndDropDown.Value
if selectedIdx && selectedIdx > 0 {
selectedText := hwndDropDown.Text
if selectedText && WinList.Has(selectedText) {
TargetHwnd := WinList[selectedText]
} else {
TargetHwnd := 0
}
} else {
TargetHwnd := 0
}
}
; ===== 执行/停止(无弹窗) =====
ExecuteAll(*) {
global TargetHwnd, KeyRows, IsRunning
local rowID := 0, key := "", delayText := "", delay := 0
if IsRunning {
MsgBox("已经在执行中,请先停止") ; 必要错误提示保留
return
}
if TargetHwnd = 0 {
MsgBox("请先选择目标窗口!")
return
}
if !WinExist("ahk_id " TargetHwnd) {
MsgBox("目标窗口不存在,请重新选择!")
return
}
IsRunning := true
for rowID in KeyRows {
keyDDL := KeyRows[rowID].Controls.Get("KeyDDL")
key := keyDDL.Text
if key = "无"
key := ""
; 跳过未设置按键的行
if !key
continue
delayText := KeyRows[rowID].Controls.Get("Delay").Text
try delay := Float(delayText) * 1000
catch {
delay := 1000
KeyRows[rowID].Controls.Get("Delay").Text := "1.0"
}
if delay < 10 {
delay := 1000
KeyRows[rowID].Controls.Get("Delay").Text := "1.0"
}
KeyRows[rowID].Run := true
KeyRows[rowID].TimerFunc := LoopSend.Bind(rowID, key, TargetHwnd)
SetTimer(KeyRows[rowID].TimerFunc, delay)
}
; 移除 MsgBox("开始执行连发")
}
StopAll(*) {
global KeyRows, IsRunning
local rowID := 0
for rowID in KeyRows {
if KeyRows[rowID].Run {
KeyRows[rowID].Run := false
if KeyRows[rowID].TimerFunc != ""
SetTimer(KeyRows[rowID].TimerFunc, 0)
}
}
IsRunning := false
; 移除 MsgBox("全部连发已停止")
}
; ===== 发送按键(根据锁定状态决定发送方式) =====
SendKey(key, hwnd) {
global LockAndActivate
; 如果启用“锁定并激活”,则激活窗口并前台发送
if LockAndActivate {
try {
WinActivate("ahk_id " hwnd)
Sleep(50)
SendInput("{" key "}")
Sleep(5)
SendInput("{" key "}")
return
}
}
; 否则仅后台发送(仅对 Tab 等少数键有效)
try {
ControlSend("{" key "}", , "ahk_id " hwnd)
Sleep(5)
ControlSend("{" key "}", , "ahk_id " hwnd)
}
}
LoopSend(rowID, key, hwnd, *) {
global KeyRows
local currentDelay := 1000
if !KeyRows[rowID].Run {
SetTimer(KeyRows[rowID].TimerFunc, 0)
return
}
if !WinExist("ahk_id " hwnd) {
KeyRows[rowID].Run := false
SetTimer(KeyRows[rowID].TimerFunc, 0)
return
}
try currentDelay := Float(KeyRows[rowID].Controls.Get("Delay").Text) * 1000
catch {
currentDelay := 1000
}
if currentDelay < 10
currentDelay := 1000
SetTimer(KeyRows[rowID].TimerFunc, currentDelay)
SendKey(key, hwnd)
}
GuiCloseEvent(*) {
StopAll()
ExitApp()
}
; ===== 锁定并激活窗口切换 =====
ToggleLockAndActivate(*) {
global LockAndActivate, hwndDropDown, RefreshBtn
LockAndActivate := !LockAndActivate
if LockAndActivate {
hwndDropDown.Enabled := false
RefreshBtn.Enabled := false
} else {
hwndDropDown.Enabled := true
RefreshBtn.Enabled := true
}
}
; ========================= 构建 GUI =========================
MainGui := Gui()
MainGui.Opt("+AlwaysOnTop +Resize +LastFound")
MainGui.Title := "后台连发工具"
MainGui.SetFont("s10", "微软雅黑")
MainGui.Add("GroupBox", "w460 h90", "窗口句柄选择")
hwndDropDown := MainGui.Add("DropDownList", "x20 y30 w350")
hwndDropDown.OnEvent("Change", OnHwndSelect)
RefreshBtn := MainGui.Add("Button", "x380 y28 w70", "刷新句柄")
RefreshBtn.OnEvent("Click", RefreshHwndList)
; 锁定并激活窗口复选框
cbLockAct := MainGui.Add("CheckBox", "x20 y65 w250", "锁定目标并激活窗口(保证所有按键生效)")
cbLockAct.OnEvent("Click", ToggleLockAndActivate)
MainGui.Add("GroupBox", "w460 h350", "快捷键设置")
KeyRows[1] := CreateKeyRow(MainGui, 20, 120)
KeyRows[2] := CreateKeyRow(MainGui, 20, 155)
KeyRows[3] := CreateKeyRow(MainGui, 20, 190)
KeyRows[4] := CreateKeyRow(MainGui, 20, 225)
KeyRows[5] := CreateKeyRow(MainGui, 20, 260)
KeyRows[6] := CreateKeyRow(MainGui, 20, 295)
KeyRows[7] := CreateKeyRow(MainGui, 20, 330)
KeyRows[8] := CreateKeyRow(MainGui, 20, 365)
KeyRows[9] := CreateKeyRow(MainGui, 250, 120)
KeyRows[10] := CreateKeyRow(MainGui, 250, 155)
KeyRows[11] := CreateKeyRow(MainGui, 250, 190)
KeyRows[12] := CreateKeyRow(MainGui, 250, 225)
KeyRows[13] := CreateKeyRow(MainGui, 250, 260)
KeyRows[14] := CreateKeyRow(MainGui, 250, 295)
KeyRows[15] := CreateKeyRow(MainGui, 250, 330)
KeyRows[16] := CreateKeyRow(MainGui, 250, 365)
executeBtn := MainGui.Add("Button", "x40 y470 w180 h30", "执行(F9)")
executeBtn.OnEvent("Click", ExecuteAll)
stopBtn := MainGui.Add("Button", "x240 y470 w180 h30", "停止(F10)")
stopBtn.OnEvent("Click", StopAll)
MainGui.Show("w480 h520")
WinSetAlwaysOnTop(true, "ahk_id " MainGui.Hwnd)
MainGui.OnEvent("Close", GuiCloseEvent)
; ===== 初始化窗口列表 =====
gList := [], gCnt := 0, gIdx := 0, gHwnd := 0, gTitle := "", gText := ""
gList := WinGetList()
gCnt := 0
for gIdx, gHwnd in gList {
if gHwnd = A_ScriptHwnd
continue
gTitle := WinGetTitle("ahk_id " gHwnd)
if !gTitle || StrLen(gTitle) > 50
continue
gCnt += 1
gText := "句柄" gCnt " " gTitle
WinList[gText] := gHwnd
hwndDropDown.Add([gText])
}
DdlItemCount := gCnt
if WinList.Count > 0 {
hwndDropDown.Value := 1
for firstKey in WinList {
TargetHwnd := WinList[firstKey]
break
}
}
; 默认第一行设为 Tab(示例)
KeyRows[1].Controls.Get("KeyDDL").Value := 2
KeyRows[1].KeyName := "Tab"
KeyRows[1].Controls.Get("Delay").Text := "1.0"
; 全局热键
Hotkey "F9", ExecuteAll
Hotkey "F10", StopAll


IP属地:河北1楼2026-08-12 21:22回复