日期:2026-10-08<br>交付:旧版本更新_修复后_v15.e(2,879,988 字节,含 v14 全部内容)<br>上一版:旧版本更新_修复后_v14.e(未改动,可随时回退)
助手是以 DLL 注入到游戏进程里的,它自己那个窗口(MainDialogWnd)是顶层窗口,<br>所以 Windows 会给它在任务栏单独开一个按钮 —— 于是任务栏上除了游戏图标,还多一个助手图标;<br>Alt+Tab 里也会多出一项。
去掉它的标准做法是给窗口加 WS_EX_TOOLWINDOW(工具窗口) 扩展样式:
Alt+Tab 列表里也不再出现Home 键切换显示/隐藏的逻辑完全不受影响⚠️ 有个必须一起做的动作:先清掉 WS_EX_APPWINDOW(0x40000)。<br>易语言生成的顶层窗口通常带着它,而它的优先级高于 WS_EX_TOOLWINDOW —— 只加不减的话,<br>任务栏按钮照样在,看起来像"没生效"。
代码/窗口程序集_MainDialogWnd.form.e.txt —— 主改动a) _MainDialogWnd_创建完毕 头部加两个局部变量(照抄同文件既有形态):
.子程序 _MainDialogWnd_创建完毕
.局部变量 界面_原扩展样式, 整数型, 数组
.局部变量 界面_新扩展样式, 整数型, 数组
b) 在该子程序末尾(创建日志定时器之后)加设置样式的代码块:
.如果真 (读配置项 (默认配置文件路径, “config”, “任务栏图标”, “0”) ≠ “1”)
界面_原扩展样式 = 取窗口样式值 (MainDialogWnd.取窗口句柄 (), #界面_GWL_EXSTYLE)
界面_新扩展样式 = 界面_原扩展样式
.如果真 (位与 (界面_新扩展样式, #界面_WS_EX_APPWINDOW) ≠ 0)
界面_新扩展样式 = 界面_新扩展样式 - #界面_WS_EX_APPWINDOW
.如果真结束
.如果真 (位与 (界面_新扩展样式, #界面_WS_EX_TOOLWINDOW) = 0)
界面_新扩展样式 = 界面_新扩展样式 + #界面_WS_EX_TOOLWINDOW
.如果真结束
SetWindowLong (MainDialogWnd.取窗口句柄 (), #界面_GWL_EXSTYLE, 界面_新扩展样式)
置窗口位置大小 (MainDialogWnd.取窗口句柄 (), 0, 0, 0, 0, 0, #界面_SWP_NOMOVE + #界面_SWP_NOSIZE + #界面_SWP_NOZORDER + #界面_SWP_FRAMECHANGED)
写日志 (“【界面】助手窗口已设为「工具窗口」…(扩展样式 … → …)” + #换行符)
.如果真结束
几个细节:
位与/+/- 而不是 位或:WS_EX_TOOLWINDOW 是单一位(0x80),该位原本为 0 时"加"就等于"置位";先判一下更稳妥,也顺手避开了本工程从没用过的 位或 命令。
位与 是核心库命令,本工程已经在用(挂机信息.加入文本 (… 位与 (…, 65535) …)),沿用同一写法。
SetWindowPos 带 SWP_FRAMECHANGED 是必须的:只改扩展样式不刷新的话,任务栏和 Alt+Tab 可能还按旧样式记着;带上它并同时置 SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER,<br>窗口位置大小层级一个都不动,只让系统重新识别样式。
SetWindowLong 是工程里已有的 DLL 声明(指向 SetWindowLongA),直接复用,没重复声明。_创建完毕 里而不是 ShowDialog 里:载入 时窗口还没显示,此时设样式,窗口显示出来就是"干净"的,不会先闪一个任务栏按钮再消失。<br>另外 写日志 在本程序集内可直接调用(它在 ShowDialog 所在程序集里,未标「公开」)。
DLL.e.txt —— 新增 2 条命令.DLL命令 取窗口样式值, 整数型, "user32", "GetWindowLongA"
.DLL命令 置窗口位置大小, 整数型, "user32", "SetWindowPos"
命名故意避开 GetWindowLongA / SetWindowPos —— 精易模块里已经有同名的公开 DLL 声明<br>(第 1780 / 1535 行),重名会撞。本工程原有的写法也是这个套路(如 SetWindowLong 指向 SetWindowLongA)。
常量.e.txt —— 新增 7 条常量界面_GWL_EXSTYLE = -20 取/置扩展样式的 nIndex
界面_WS_EX_TOOLWINDOW = 128 0x80 工具窗口
界面_WS_EX_APPWINDOW = 262144 0x40000 强制显示任务栏按钮(要先清掉)
界面_SWP_NOSIZE = 1
界面_SWP_NOMOVE = 2
界面_SWP_NOZORDER = 4
界面_SWP_FRAMECHANGED = 32
全部带 界面_ 前缀:精易模块里已经有 #GWL_EXSTYLE、#SWP_NOMOVE、#SWP_NOSIZE 等同名常量,<br>直接叫 #GWL_EXSTYLE 有撞名风险,加前缀彻底避开。
<客户端目录>\config\Default.ini 的 [config] 段加一行:
[config]
任务栏图标=1
缺省 = 0(不显示图标)。改成 1 再重进游戏就恢复原样。
Alt+Tab 走一圈 —— 助手的窗口不出现在列表里config\log\<角色名>.txt):【界面】助手窗口已设为「工具窗口」:任务栏不再显示按钮、不进 Alt+Tab(扩展样式 262144 → 128)
扩展样式从 262144(0x40000,APPWINDOW)变成 128(0x80,TOOLWINDOW),就是对的。
| 检查 | 结果 |
|---|---|
| 补丁锚点 | 4 处,各命中唯一 1 次 |
| 原有内容零丢失 | 取当前线程ID / 脚本接口令牌 / 脚本接口地址 / 创建定时器 逐项复核 |
tools/_check_blocks.py(控制块配对) | 主本 8 文件 0 处 |
tools/_check_decls.py(数组性) | 15 文件 / 69 处数组 / 误声明 0 处 |
| t2e 编译 | 0 错 0 警 |
| e2t 回转 | 0 错 0 警 |
| 回转产物逐文件控制块体检 | 0 处 |
| 主本 vs 回转 关键点对拍 | 16 项全部一致 |
.e 二进制标识核实 | 新变量/DLL/常量/日志文本全部搜到;取当前线程ID 等原有标识仍在 |
项目.etprj | 已还原 |
第一版补丁脚本里,新内容忘了把锚点行本身拼回去,导致 DLL.e.txt 丢掉<br>取当前线程ID 声明、常量.e.txt 丢掉 脚本接口令牌 常量(t2e 能过,但引用它们的代码会全废)。<br>当场发现 → 回滚三个文件 → 给脚本加了通用防呆:
# 新内容必须完整包含原锚点,否则会把锚点那一行原声明一起吃掉
for name, path, old, new in PATCHES:
assert old in new
以后所有「追加式」补丁都走这条断言。
旧版本更新_修复后_v15.e → F7 编译 → 覆盖到每一台机器的 test.dlltest.dll 换掉(v13 那个语法错误文件 …_v13_语法错误_勿编译.e.bad 别再碰)⚠️ 旧版本更新_修复后_v14.e / v13a / 原始 .e 全都没动,可随时回退。
YGOnline.exe 自己的窗口,助手无法(也不应该)去动它。如果你想要的是"挂机时任务栏完全干净",那需要另外处理游戏窗口 ——<br>说一声我再想办法。
Alt+Tab 也一起消失是这个方案的正常副作用(WS_EX_TOOLWINDOW 同时管这两件事)。如果你希望"任务栏没有、但 Alt+Tab 还能切",那要换用 ITaskbarList 接口单独删任务栏按钮 —— 需要另外加 COM 调用。