昨夜风吹雨🍀 六道飞雪
关注数: 182 粉丝数: 298 发帖数: 7,476 关注贴吧数: 72
刚回归 配合请神谢了个按键小助手 代码分享 只能 调整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
1 下一页