如何修改NSIS Graphical Installer按钮鼠标悬停行为匹配Win10效果
NSIS Graphical Installer 按钮悬停效果适配Win10方案
问题根因
Graphical Installer 默认使用自绘按钮控件,默认仅监听了BN_CLICKED点击事件,没有绑定WM_MOUSEMOVE/WM_MOUSELEAVE鼠标进出事件,因此不会触发悬停状态重绘,表现为只有点击时才会高亮。
具体修改步骤
- 第一步:在NSIS脚本头部引入Windows消息相关依赖头文件,添加如下代码:
!include "WinMessages.nsh" !include "nsDialogs.nsh"
- 第二步:给目标按钮绑定鼠标事件回调,在按钮创建完成后添加事件监听逻辑:
# 按钮创建后获取控件句柄存为$hTargetButton,绑定进出事件 ${NSD_OnMouseOver} $hTargetButton onButtonHover ${NSD_OnMouseOut} $hTargetButton onButtonHoverOut
- 第三步:实现悬停和移出的回调函数,手动修改按钮状态触发匹配Win10的高亮重绘:
Function onButtonHover ; 发送消息设置按钮为悬停状态 SendMessage $hTargetButton ${BM_SETSTATE} ${BST_HOT} 0 FunctionEnd Function onButtonHoverOut ; 恢复按钮为普通未激活状态 SendMessage $hTargetButton ${BM_SETSTATE} 0 0 FunctionEnd
- 第四步:如果你使用了Graphical Installer的预定义皮肤包,需要额外关闭旧版按钮兼容模式,在脚本初始化阶段添加配置:
GraphicalInstaller::SetOption "EnableLegacyButtonMode" "0"
验证注意事项
- 编译后测试安装包不要在Windows兼容模式下运行,否则会强制 fallback 到旧版Windows控件样式
- 如果是自定义按钮皮肤的场景,需要额外准备悬停状态的按钮素材图,在回调函数中调用
${NSD_SetImage}替换即可生效
内容的提问来源于stack exchange,提问作者fajir moin
相关产品推荐
相关产品推荐

