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

NSIS进度条在韩日中系统语言下被状态栏遮挡的修复方案咨询

解决NSIS进度条在东亚语言环境下被状态栏遮挡的问题

问题根源在于你使用了**固定的Y坐标(353)**定位进度条,但韩语、日语、中文等东亚语言系统中,状态栏因字体或布局差异,高度可能与英文环境不同,导致固定位置的进度条被状态栏遮挡。

修改方案:动态计算进度条位置

通过获取状态栏的实际高度,动态计算进度条的Y坐标,同时确保进度条的Z顺序在状态栏上方。

修改后的代码

; 定义所需常量(如果脚本中未定义)
!define SB_GETHEIGHT 0x0000000E
!define SWP_SHOWWINDOW 0x0040

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1004 ; 获取进度条控件句柄

; 获取状态栏控件句柄(通过类名定位,比固定ID更可靠)
FindWindowEx $2 $0 "msctls_statusbar32" ""

; 获取状态栏的实际高度
SendMessage $2 ${SB_GETHEIGHT} 0 0 $3

; 获取安装对话框的客户区高度
GetClientRect $0 $4 $5 ; $4=客户区宽度,$5=客户区高度

; 计算进度条的Y坐标:客户区高度 - 状态栏高度 - 进度条高度(保持原代码的进度条高度100)
IntOp $6 $5 - $3
IntOp $6 $6 - 100

; 保留原有的进度条样式与颜色设置
System::Call UxTheme::SetWindowTheme(ir1,w"",w"")
SendMessage $1 ${PBM_SETBARCOLOR} 0 0x0083FF ; BGR格式
SendMessage $1 ${CCM_SETBKCOLOR} 0 0xFFFFFF

; 动态定位进度条,确保在状态栏上方(hWndInsertAfter设为0表示置于最上层)
System::Call 'user32::SetWindowPos(i$1,i0,i0,i$6,i541,i100,i${SWP_SHOWWINDOW})'

关键修改点说明

  1. 动态获取状态栏高度:通过SB_GETHEIGHT消息获取状态栏的实际高度,避免因语言环境差异导致的高度偏差。
  2. 计算Y坐标:基于对话框客户区高度和状态栏高度,反向推导进度条的顶部位置,确保进度条始终位于状态栏上方。
  3. 调整Z顺序:将SetWindowPos的hWndInsertAfter参数设为0(即HWND_TOP),强制进度条显示在所有控件的最上层,彻底解决被遮挡的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:43:16