v16 把助手窗口 SetParent 成游戏主窗口的子窗口后,窗口只闪一下就消失、再也看不见。
热血江湖是 D3D 渲染的游戏,每帧把整个客户区用 Direct3D 重绘一遍。<br>普通 GDI 子窗口会被压在游戏渲染层下面:
结论:把普通窗口 SetParent 成 D3D 游戏窗口的子窗口,对这类游戏天生无效(除非去 hook D3D 的 present,那是另一套大工程)。v16 的方向走错了。
不再做子窗口,改为:
WS_EX_TOPMOST(0x8)样式 → 浮在游戏窗口之上,因为不再进游戏 D3D 渲染层,所以永远不会被画面盖掉。
吸附定时回调)按游戏窗口的屏幕坐标(GetWindowRect)把助手贴到左下角:x = 游戏左、y = 游戏底 - 助手高(左对齐 + 下对齐)。
MainDialogWnd.可视 = 假 隐藏;还原后按 吸附_用户可见(Home 键意图)恢复显隐,与原有 Home 切换互不打架。
视觉上仍是你要的:左对齐、下对齐、随游戏窗口移动就移动,但这次真能一直看见。
常量.e.txt:+ 界面_WS_EX_TOPMOST = "8"(原 界面_WS_CHILD/WS_POPUP/GWL_STYLE/SWP_NOACTIVATE 已无用,保留为未引用声明,无害)DLL.e.txt:+ IsIconic_API(user32 IsIconic,判断最小化);SetParent/GetClientRect_API 改为未引用,保留无害全局变量.e.txt:吸附_上次宽/吸附_上次高吸附_用户可见(逻辑型)、吸附_上次左/上/右/下(整数型,记录游戏窗口屏幕矩形)吸附_游戏窗口句柄/吸附_已启用 语义改为「跟随」参照代码/窗口程序集_MainDialogWnd.form.e.txt:_MainDialogWnd_创建完毕 吸附块:去掉 SetParent/WS_CHILD/GetClientRect,改为加 WS_EX_TOPMOST + 用 GetWindowRect 定位左下角(带矩形有效性保护,游戏未就绪时保持默认位置等定时器自愈)吸附定时回调:改为屏幕坐标跟随 + 最小化隐藏 + 按用户意图恢复显示窗口(Home 键):末尾同步 吸附_用户可见 = MainDialogWnd.可视tools/_check_blocks.py 控制块配对 0 处tools/_check_decls.py 声明体检 69 数组 / 0 误声明旧版本更新_修复后_v17.eSetParent/GetClientRect 写法已清除旧版本更新_修复后.e 时间戳未变(未被覆盖)旧版本更新_修复后_v17.e,覆盖各机器 test.dll,别点「旧版覆盖」。旧版本更新_修复后_v16.e(会一闪而过)。config\Default.ini [config] 吸附游戏窗口 = 0 可关掉跟随,恢复独立窗口(默认开)。WS_EX_TOPMOST 会始终浮在最前(含切到别的程序时也浮着),属正常 overlay 行为。错误(10044): 不能将"逻辑型"数据转换到"整数型"数据,指向 .如果真 (IsIconic_API (吸附_游戏窗口句柄) ≠ 0)。IsIconic_API 在 DLL.e.txt 声明为返回 逻辑型,而 ≠ 0 要求两侧都是整数型 → 类型冲突。IsIconic_API 返回类型改为 整数型(Win32 IsIconic 返回 BOOL=int,本就该是整数),调用处 ≠ 0 不动即合法。≠ 0 比较,声明必须写「整数型」而非「逻辑型」。≠ 0 的左操作数都是整数型(线程句柄、位与结果),无同类隐患。旧版本更新_修复后_v17.e:0 错误 0 警告,用户原 .e 未被触碰。.如果真)。吸附_没变 标志变量承接(5 个 .如果真… .如果真结束),120/181 行各拆 2 层嵌套;并弃用单行 .如果真 (X) Y 写法(门禁脚本不识别会误报未闭合)。_check_blocks.py 0 处(此前单行写法误报 1 处未闭合,改完整块后通过)、t2e 0 错误 0 警告、吸附代码已无任何「且」链。重编 旧版本更新_修复后_v17.e。