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})'
关键修改点说明
- 动态获取状态栏高度:通过
SB_GETHEIGHT消息获取状态栏的实际高度,避免因语言环境差异导致的高度偏差。 - 计算Y坐标:基于对话框客户区高度和状态栏高度,反向推导进度条的顶部位置,确保进度条始终位于状态栏上方。
- 调整Z顺序:将
SetWindowPos的hWndInsertAfter参数设为0(即HWND_TOP),强制进度条显示在所有控件的最上层,彻底解决被遮挡的问题。
内容的提问来源于stack exchange,提问作者Abhiroop Saha
相关产品推荐
相关产品推荐

