如何在AHK脚本中实现按钮按下变色、再按恢复白色
实现AutoHotkey按钮颜色切换功能
要实现按钮默认白色、按下切换为其他颜色、再次按下恢复白色的功能,需要借助Windows API修改按钮外观,结合状态变量跟踪每个按钮的切换状态。以下是整合了你原有Roblox窗口激活功能的完整解决方案:
#NoEnv #SingleInstance force ; 获取所有Roblox窗口ID列表 WinGet, robloxid, list, ahk_exe RobloxPlayerBeta.exe ; 定义每个按钮的切换状态变量(初始为未切换) Button1Toggled := false Button2Toggled := false Button3Toggled := false Button4Toggled := false Button5Toggled := false Button6Toggled := false Button7Toggled := false Button8Toggled := false Gui +hwndMyGui ; 添加按钮并指定变量名(用于获取窗口句柄),启用OwnerDraw样式以支持颜色修改 Gui Add, Button, x10 y10 w200 h30 gButton1 vButton1 +OwnerDraw, Roblox 1 Gui Add, Button, x10 y50 w200 h30 gButton2 vButton2 +OwnerDraw, Roblox 2 Gui Add, Button, x10 y90 w200 h30 gButton3 vButton3 +OwnerDraw, Roblox 3 Gui Add, Button, x10 y130 w200 h30 gButton4 vButton4 +OwnerDraw, Roblox 4 Gui Add, Button, x10 y170 w200 h30 gButton5 vButton5 +OwnerDraw, Roblox 5 Gui Add, Button, x10 y210 w200 h30 gButton6 vButton6 +OwnerDraw, Roblox 6 Gui Add, Button, x10 y250 w200 h30 gButton7 vButton7 +OwnerDraw, Roblox 7 Gui Add, Button, x10 y290 w200 h30 gButton8 vButton8 +OwnerDraw, Roblox 8 Gui Show, x200 y200 h350 w220, Roblox Buttons ; 获取每个按钮的窗口句柄(HWND) GuiControlGet, hButton1, Hwnd, Button1 GuiControlGet, hButton2, Hwnd, Button2 GuiControlGet, hButton3, Hwnd, Button3 GuiControlGet, hButton4, Hwnd, Button4 GuiControlGet, hButton5, Hwnd, Button5 GuiControlGet, hButton6, Hwnd, Button6 GuiControlGet, hButton7, Hwnd, Button7 GuiControlGet, hButton8, Hwnd, Button8 ; 设置按钮初始颜色为默认白色 SetButtonColor(hButton1, false) SetButtonColor(hButton2, false) SetButtonColor(hButton3, false) SetButtonColor(hButton4, false) SetButtonColor(hButton5, false) SetButtonColor(hButton6, false) SetButtonColor(hButton7, false) SetButtonColor(hButton8, false) Return GuiClose: ExitApp Return ; 按钮1点击事件:激活对应Roblox窗口并切换颜色 Button1: WinActivate ahk_id %robloxid1% Button1Toggled := !Button1Toggled SetButtonColor(hButton1, Button1Toggled) Return ; 按钮2点击事件 Button2: WinActivate ahk_id %robloxid2% Button2Toggled := !Button2Toggled SetButtonColor(hButton2, Button2Toggled) Return ; 按钮3点击事件 Button3: WinActivate ahk_id %robloxid3% Button3Toggled := !Button3Toggled SetButtonColor(hButton3, Button3Toggled) Return ; 按钮4点击事件 Button4: WinActivate ahk_id %robloxid4% Button4Toggled := !Button4Toggled SetButtonColor(hButton4, Button4Toggled) Return ; 按钮5点击事件 Button5: WinActivate ahk_id %robloxid5% Button5Toggled := !Button5Toggled SetButtonColor(hButton5, Button5Toggled) Return ; 按钮6点击事件 Button6: WinActivate ahk_id %robloxid6% Button6Toggled := !Button6Toggled SetButtonColor(hButton6, Button6Toggled) Return ; 按钮7点击事件 Button7: WinActivate ahk_id %robloxid7% Button7Toggled := !Button7Toggled SetButtonColor(hButton7, Button7Toggled) Return ; 按钮8点击事件 Button8: WinActivate ahk_id %robloxid8% Button8Toggled := !Button8Toggled SetButtonColor(hButton8, Button8Toggled) Return ; 设置按钮颜色的核心函数 SetButtonColor(hButton, isToggled) { static BCM_SETCOLORS := 0x1601 static COLOR_WINDOW := 5 static TOGGLE_COLOR := 0xDDEEFF ; 切换后的颜色(浅蓝色,可自行修改RGB值) ; 根据切换状态选择背景色 bgColor := isToggled ? TOGGLE_COLOR : DllCall("GetSysColor", "UInt", COLOR_WINDOW, "UInt") textColor := 0x000000 ; 文本颜色为黑色 ; 打包颜色数据为BUTTON_BMP_COLORS结构体 colorStruct := NumPut(textColor, 0, "UInt") colorStruct := NumPut(bgColor, colorStruct, "UInt") ; 发送消息修改按钮颜色 SendMessage, BCM_SETCOLORS, 0, % colorStruct,, ahk_id %hButton% ; 重绘按钮使颜色生效 DllCall("RedrawWindow", "Ptr", hButton, "Ptr", 0, "Ptr", 0, "UInt", 0x0008 | 0x0010) }
关键说明:
- 状态变量:每个按钮对应一个
ButtonXToggled变量,记录当前是否处于切换状态。 - 按钮句柄:通过
GuiControlGet获取按钮的HWND,这是修改按钮外观的必要条件。 - 颜色设置函数:
SetButtonColor使用Windows API的BCM_SETCOLORS消息修改按钮背景和文本颜色,支持Windows Vista及以上系统。 - 自定义颜色:可修改
TOGGLE_COLOR的值设置切换后的颜色,RGB值格式为0xRRGGBB(例如0xFF0000为红色)。 - 初始颜色:脚本启动时将所有按钮设置为系统默认窗口颜色(通常为白色)。
内容的提问来源于stack exchange,提问作者Arrow
相关产品推荐
相关产品推荐

