You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)
}

关键说明:

  1. 状态变量:每个按钮对应一个ButtonXToggled变量,记录当前是否处于切换状态。
  2. 按钮句柄:通过GuiControlGet获取按钮的HWND,这是修改按钮外观的必要条件。
  3. 颜色设置函数:SetButtonColor使用Windows API的BCM_SETCOLORS消息修改按钮背景和文本颜色,支持Windows Vista及以上系统。
  4. 自定义颜色:可修改TOGGLE_COLOR的值设置切换后的颜色,RGB值格式为0xRRGGBB(例如0xFF0000为红色)。
  5. 初始颜色:脚本启动时将所有按钮设置为系统默认窗口颜色(通常为白色)。

内容的提问来源于stack exchange,提问作者Arrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:49:54