quickwin 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.en.md +21 -26
  2. package/README.md +3 -6
  3. package/examples/exec_server.js +139 -31
  4. package/examples/exec_server.tsx +7 -8
  5. package/examples/exec_server_worker.js +1 -1
  6. package/examples/exec_server_worker.ts +2 -2
  7. package/examples/pdf_preview2.js +1 -1
  8. package/examples/pdf_preview2.ts +1 -1
  9. package/examples/pdf_viewer.js +132 -28
  10. package/examples/pdf_viewer.tsx +1 -1
  11. package/examples/test_gallery.js +131 -27
  12. package/examples/test_react_lazy.js +131 -27
  13. package/examples/test_react_listbox.js +131 -27
  14. package/examples/test_root_window.js +131 -27
  15. package/examples/test_tab.js +131 -27
  16. package/lib/certs.js +13 -8
  17. package/lib/certs.ts +13 -8
  18. package/lib/fetch.js +51 -3
  19. package/lib/fetch.ts +38 -3
  20. package/lib/ffi/bind.js +94 -5
  21. package/lib/ffi/bind.ts +107 -10
  22. package/lib/ffi/ctype.js +33 -7
  23. package/lib/ffi/ctype.ts +48 -10
  24. package/lib/ffi/struct.js +92 -14
  25. package/lib/ffi/struct.ts +108 -19
  26. package/lib/react-qw/components/ListView.js +1 -0
  27. package/lib/react-qw/components/PathPicker.js +2 -2
  28. package/lib/react-qw/index.js +1 -1
  29. package/lib/react-qw/index.ts +4 -1
  30. package/lib/text-measure.js +3 -1
  31. package/lib/text-measure.ts +4 -3
  32. package/lib/websocket.js +32 -2
  33. package/lib/websocket.ts +25 -2
  34. package/lib/windows/advapi32.js +53 -0
  35. package/lib/windows/advapi32.ts +64 -0
  36. package/lib/windows/comctl32.js +15 -15
  37. package/lib/windows/comctl32.ts +15 -16
  38. package/lib/windows/comdlg32.js +3 -2
  39. package/lib/windows/comdlg32.ts +3 -2
  40. package/lib/windows/gdi32.js +328 -26
  41. package/lib/windows/gdi32.ts +349 -26
  42. package/lib/windows/kernel32.js +206 -10
  43. package/lib/windows/kernel32.ts +225 -10
  44. package/lib/windows/msimg32.js +38 -0
  45. package/lib/windows/msimg32.ts +45 -0
  46. package/lib/windows/ntdll.js +3 -2
  47. package/lib/windows/ntdll.ts +3 -2
  48. package/lib/windows/ole32.js +1 -1
  49. package/lib/windows/ole32.ts +1 -1
  50. package/lib/windows/psapi.js +32 -0
  51. package/lib/windows/psapi.ts +37 -0
  52. package/lib/windows/shell32.js +5 -3
  53. package/lib/windows/shell32.ts +5 -3
  54. package/lib/windows/structs.js +135 -0
  55. package/lib/windows/structs.ts +144 -0
  56. package/lib/windows/user32.js +202 -99
  57. package/lib/windows/user32.ts +204 -99
  58. package/lib/windows/version.js +29 -0
  59. package/lib/windows/version.ts +35 -0
  60. package/lib/windows/winspool.js +71 -0
  61. package/lib/windows/winspool.ts +80 -0
  62. package/package.json +1 -1
  63. package/quickwin.d.ts +11 -5
  64. package/quickwin_const.d.ts +136 -0
  65. package/qwin-nowasm-x86.exe +0 -0
  66. package/qwin-nowasm.exe +0 -0
  67. package/qwin-x86.exe +0 -0
  68. package/qwin.exe +0 -0
  69. package/test/run.js +7 -0
  70. package/test/run.ts +7 -0
  71. package/test/test_basic_fetch.js +21 -0
  72. package/test/test_basic_fetch.ts +17 -0
  73. package/test/test_ffi.js +6 -6
  74. package/test/test_ffi.ts +6 -6
  75. package/test/test_ffi_abi.js +55 -0
  76. package/test/test_ffi_abi.ts +56 -0
  77. package/test/test_ffi_array.js +116 -0
  78. package/test/test_ffi_array.ts +141 -0
  79. package/test/test_ffi_bind.js +82 -0
  80. package/test/test_ffi_bind.ts +71 -0
  81. package/test/test_files.js +102 -0
  82. package/test/test_files.ts +121 -0
  83. package/test/test_gdi_draw.js +681 -0
  84. package/test/test_gdi_draw.ts +725 -0
  85. package/test/test_net_fetch.js +4 -3
  86. package/test/test_net_fetch.ts +4 -3
  87. package/test/test_printer.js +137 -0
  88. package/test/test_printer.ts +148 -0
  89. package/test/test_proc.js +141 -0
  90. package/test/test_proc.ts +163 -0
  91. package/test/test_react_complex.js +131 -27
  92. package/test/test_react_counter.js +131 -27
  93. package/test/test_react_flex.js +131 -27
  94. package/test/test_react_hidden.js +131 -27
  95. package/test/test_react_listview_link.js +131 -27
  96. package/test/test_react_notify.js +131 -27
  97. package/test/test_react_render.js +131 -27
  98. package/test/test_registry.js +74 -0
  99. package/test/test_registry.ts +95 -0
  100. package/test/test_sysinfo.js +122 -0
  101. package/test/test_sysinfo.ts +141 -0
  102. package/test/test_wolfssl_read.js +45 -44
  103. package/test/test_wolfssl_read.ts +42 -42
@@ -25,7 +25,7 @@
25
25
  import * as os from 'os';
26
26
  import { bind } from '../ffi/bind.js';
27
27
  // 只 import 注册了 encoder 的结构(纯入参位);POINT 等出/就地位不注册,运行时无需引用
28
- import { RECT, SCROLLINFO } from './structs.js';
28
+ import { MSG, RECT, SCROLLINFO, WNDCLASSEXW } from './structs.js';
29
29
  // dll 名部分应用:85 个绑定共用,签名字符串不再重复 'user32.dll'。
30
30
  // 不能用 bind.bind(null, dll)——泛型在部分应用点坍缩(返回 never);工厂转调让
31
31
  // S/LE/LD 在调用点正常 infer。第三参透传 encoders(结构入参位注册,见头注释方向约定)。
@@ -38,7 +38,8 @@ void _bProbe;
38
38
  // 仅 x64 提供真实符号)——按架构选真实导出名,导出名保持统一。
39
39
  const LONG_PTR_SYM = os.arch === 'x64' ? 'PtrW' : 'W';
40
40
  // ============ 窗口 / 基本 ============
41
- /** 创建窗口;失败 → NULL
41
+ /** 创建窗口
42
+ * @returns 窗口句柄;失败 → NULL
42
43
  * @param args_0 dwExStyle WS_EX_*
43
44
  * @param args_1 lpClassName 窗口类名 string 或 NULL
44
45
  * @param args_2 lpWindowName 窗口标题 string 或 NULL
@@ -52,14 +53,17 @@ const LONG_PTR_SYM = os.arch === 'x64' ? 'PtrW' : 'W';
52
53
  * @param args_10 hInstance 模块句柄(可 NULL)
53
54
  * @param args_11 lpParam 窗口创建参数,传 NULL */
54
55
  export const CreateWindowEx = /*@__PURE__*/ b('CreateWindowExW', 'u32 <WCHAR>ptr <WCHAR>ptr u32 i32 i32 i32 i32 <HWND>ptr <HMENU>ptr <HMODULE>ptr <>ptr -> <HWND>ptr');
55
- /** 销毁窗口;成功 → 非 0
56
+ /** 销毁窗口
57
+ * @returns 成功 → 非 0
56
58
  * @param args_0 hWnd */
57
59
  export const DestroyWindow = /*@__PURE__*/ b('DestroyWindow', '<HWND>ptr -> i32');
58
- /** 显示/隐藏窗口(nCmdShow = gui.WindowStyle 类常量);返回先前可见性
60
+ /** 显示/隐藏窗口(nCmdShow = gui.WindowStyle 类常量)
61
+ * @returns 先前可见性
59
62
  * @param args_0 hWnd
60
63
  * @param args_1 nCmdShow 显示命令(SW_SHOW/SW_HIDE 等) */
61
64
  export const ShowWindow = /*@__PURE__*/ b('ShowWindow', '<HWND>ptr i32@ShowWindowCmd -> i32');
62
65
  /** 移动/缩放窗口
66
+ * @returns 成功 → 非 0;失败 → 0(原因见 GetLastError)
63
67
  * @param args_0 hWnd
64
68
  * @param args_1 x 新左上角
65
69
  * @param args_2 y 新左上角
@@ -68,6 +72,7 @@ export const ShowWindow = /*@__PURE__*/ b('ShowWindow', '<HWND>ptr i32@ShowWindo
68
72
  * @param args_5 bRepaint 非 0 立即重绘 */
69
73
  export const MoveWindow = /*@__PURE__*/ b('MoveWindow', '<HWND>ptr i32 i32 i32 i32 i32 -> i32');
70
74
  /** 设窗口位置/层级
75
+ * @returns 成功 → 非 0;失败 → 0(原因见 GetLastError)
71
76
  * @param args_0 hWnd
72
77
  * @param args_1 hWndInsertAfter 置前窗口或 HWND_TOP(-1)/BOTTOM(-2)/NOTOPMOST(-2) 常量
73
78
  * @param args_2 x 新位置
@@ -79,126 +84,158 @@ export const MoveWindow = /*@__PURE__*/ b('MoveWindow', '<HWND>ptr i32 i32 i32 i
79
84
  // 值域是枚举而非句柄 —— 指针位 @ 标注试点。
80
85
  export const SetWindowPos = /*@__PURE__*/ b('SetWindowPos', '<HWND>ptr <>ptr@SetWindowPosHwnd i32 i32 i32 i32 u32 -> i32');
81
86
  /** 取窗口外框矩形(屏幕坐标)
87
+ * @returns 成功 → 非 0;失败 → 0(原因见 GetLastError)
82
88
  * @param args_0 hWnd
83
89
  * @param args_1 lpRect 出参槽,传 RECT.alloc().ptr、RECT.decode 读回 */
84
90
  export const GetWindowRect = /*@__PURE__*/ b('GetWindowRect', '<HWND>ptr <RECT>ptr -> i32');
85
91
  /** 取窗口客户区矩形
92
+ * @returns 成功 → 非 0;失败 → 0(原因见 GetLastError)
86
93
  * @param args_0 hWnd
87
94
  * @param args_1 lpRect 出参槽,传 RECT.alloc().ptr、RECT.decode 读回 */
88
95
  export const GetClientRect = /*@__PURE__*/ b('GetClientRect', '<HWND>ptr <RECT>ptr -> i32');
89
- /** 是否有效窗口句柄;是 → 非 0
96
+ /** 是否有效窗口句柄
97
+ * @returns 是 → 非 0
90
98
  * @param args_0 hWnd */
91
99
  export const IsWindow = /*@__PURE__*/ b('IsWindow', '<HWND>ptr -> i32');
92
- /** 窗口是否可见;是 → 非 0
100
+ /** 窗口是否可见
101
+ * @returns 是 → 非 0
93
102
  * @param args_0 hWnd */
94
103
  export const IsWindowVisible = /*@__PURE__*/ b('IsWindowVisible', '<HWND>ptr -> i32');
95
- /** 窗口是否最小化;是 → 非 0
104
+ /** 窗口是否最小化
105
+ * @returns 是 → 非 0
96
106
  * @param args_0 hWnd */
97
107
  export const IsIconic = /*@__PURE__*/ b('IsIconic', '<HWND>ptr -> i32');
98
- /** 取前台窗口句柄;无 → NULL */
108
+ /** 取前台窗口
109
+ * @returns 前台窗口句柄;无 → NULL */
99
110
  export const GetForegroundWindow = /*@__PURE__*/ b('GetForegroundWindow', ' -> <HWND>ptr');
100
- /** 请求设前台窗口;成功 → 非 0
111
+ /** 请求设前台窗口
112
+ * @returns 成功 → 非 0
101
113
  * @param args_0 hWnd 目标窗口 */
102
114
  export const SetForegroundWindow = /*@__PURE__*/ b('SetForegroundWindow', '<HWND>ptr -> i32');
103
- /** 取桌面窗口句柄(恒非 NULL) */
115
+ /** 取桌面窗口
116
+ * @returns 桌面窗口句柄(恒非 NULL) */
104
117
  export const GetDesktopWindow = /*@__PURE__*/ b('GetDesktopWindow', ' -> <HWND>ptr');
105
- /** 按类名+标题查找顶层窗口;无 → NULL
118
+ /** 按类名+标题查找顶层窗口
119
+ * @returns 窗口句柄;无 → NULL
106
120
  * @param args_0 lpClassName 窗口类名 string 或 NULL
107
121
  * @param args_1 lpWindowName 窗口标题 string 或 NULL */
108
122
  export const FindWindow = /*@__PURE__*/ b('FindWindowW', '<WCHAR>ptr <WCHAR>ptr -> <HWND>ptr');
109
123
  /** 在 hWndParent 的子窗口链里按类名+标题查找,从 hWndChildAfter 之后开始;
110
- * 无更多窗口 → NULL。链式遍历:FindWindowEx(NULL, prev, NULL, NULL)
124
+ * 链式遍历:FindWindowEx(NULL, prev, NULL, NULL)
125
+ * @returns 窗口句柄;无更多窗口 → NULL
111
126
  * @param args_0 hWndParent 父窗口,NULL = 遍历顶层
112
127
  * @param args_1 hWndChildAfter 起始子窗口,NULL = 从头
113
128
  * @param args_2 lpszClass 类名 string 或 NULL = 不过滤
114
129
  * @param args_3 lpszWindow 标题 string 或 NULL = 不过滤 */
115
130
  export const FindWindowEx = /*@__PURE__*/ b('FindWindowExW', '<HWND>ptr <HWND>ptr <WCHAR>ptr <WCHAR>ptr -> <HWND>ptr');
116
- /** 取窗口标题;返回写入字符数,不含 NUL
131
+ /** 取窗口标题
132
+ * @returns 写入字符数,不含 NUL
117
133
  * @param args_0 hWnd
118
134
  * @param args_1 lpString 出参缓冲,传 WCHAR.alloc(n)、WCHAR.decode(buf) 读回
119
135
  * @param args_2 nMaxCount 缓冲容量(字符数,含 NUL 余量) */
120
136
  export const GetWindowText = /*@__PURE__*/ b('GetWindowTextW', '<HWND>ptr <BYTE>ptr i32 -> i32');
121
- /** 设窗口标题(传 string 或 NULL 清空);成功 → 非 0
137
+ /** 设窗口标题(传 string 或 NULL 清空)
138
+ * @returns 成功 → 非 0
122
139
  * @param args_0 hWnd
123
140
  * @param args_1 lpString 新标题 string 或 NULL */
124
141
  export const SetWindowText = /*@__PURE__*/ b('SetWindowTextW', '<HWND>ptr <WCHAR>ptr -> i32');
125
- /** 取窗口标题长度(字符数,不含 NUL)
142
+ /** 取窗口标题长度
143
+ * @returns 标题长度(字符数,不含 NUL)
126
144
  * @param args_0 hWnd */
127
145
  export const GetWindowTextLength = /*@__PURE__*/ b('GetWindowTextLengthW', '<HWND>ptr -> i32');
128
- /** 取窗口类名;返回写入字符数
146
+ /** 取窗口类名
147
+ * @returns 写入字符数
129
148
  * @param args_0 hWnd
130
149
  * @param args_1 lpClassName 出参缓冲,传 WCHAR.alloc(n)、WCHAR.decode(buf) 读回
131
150
  * @param args_2 nMaxCount 缓冲容量(字符数) */
132
151
  export const GetClassName = /*@__PURE__*/ b('GetClassNameW', '<HWND>ptr <BYTE>ptr i32 -> i32');
133
- /** 取窗口附加数据;0 保真(值有符号读;ia32 走 GetWindowLongW)
152
+ /** 取窗口附加数据(ia32 走 GetWindowLongW)
153
+ * @returns 附加数据值;0 保真(值有符号读)
134
154
  * @param args_0 hWnd
135
155
  * @param args_1 nIndex 索引(GWLP_WNDPROC/GWLP_USERDATA/GWL_STYLE 等) */
136
156
  export const GetWindowLongPtr = /*@__PURE__*/ b('GetWindowLong' + LONG_PTR_SYM, '<HWND>ptr i32@Gwlp -> <>ptr');
137
- /** 设窗口附加数据;返回先前值(0 保真,值有符号读)
157
+ /** 设窗口附加数据
158
+ * @returns 先前值(0 保真,值有符号读)
138
159
  * @param args_0 hWnd
139
160
  * @param args_1 nIndex 索引(GWLP_* / GWL_*)
140
161
  * @param args_2 dwNewLong 新值(整数或指针混合值) */
141
162
  export const SetWindowLongPtr = /*@__PURE__*/ b('SetWindowLong' + LONG_PTR_SYM, '<HWND>ptr i32@Gwlp <>ptr -> <>ptr');
142
- /** 取窗口所属线程 ID(第二参可传 NULL 不取进程 ID)
163
+ /** 取窗口所属线程(第二参可传 NULL 不取进程 ID)
164
+ * @returns 线程 ID
143
165
  * @param args_0 hWnd
144
166
  * @param args_1 lpdwProcessId 出参槽,传 Uint32Array(1).buffer 或 NULL */
145
167
  export const GetWindowThreadProcessId = /*@__PURE__*/ b('GetWindowThreadProcessId', '<HWND>ptr <BYTE>ptr -> u32');
146
- /** 启用/禁用窗口输入;返回先前状态
168
+ /** 启用/禁用窗口输入
169
+ * @returns 先前状态
147
170
  * @param args_0 hWnd
148
171
  * @param args_1 bEnable 非 0 启用 */
149
172
  export const EnableWindow = /*@__PURE__*/ b('EnableWindow', '<HWND>ptr i32 -> i32');
150
- /** 取父窗口;无 → NULL
173
+ /** 取父窗口
174
+ * @returns 父窗口句柄;无 → NULL
151
175
  * @param args_0 hWnd */
152
176
  export const GetParent = /*@__PURE__*/ b('GetParent', '<HWND>ptr -> <HWND>ptr');
153
- /** 设父窗口;返回先前父窗口
177
+ /** 设父窗口
178
+ * @returns 先前父窗口
154
179
  * @param args_0 hWndChild 子窗口
155
180
  * @param args_1 hWndNewParent 新父窗口 */
156
181
  export const SetParent = /*@__PURE__*/ b('SetParent', '<HWND>ptr <HWND>ptr -> <HWND>ptr');
157
- /** 按关系取相邻窗口;无 → NULL
182
+ /** 按关系取相邻窗口
183
+ * @returns 窗口句柄;无 → NULL
158
184
  * @param args_0 hWnd
159
185
  * @param args_1 uCmd 关系(GW_CHILD=4/GW_HWNDNEXT=2/GW_OWNER=4 等 GW_*) */
160
186
  export const GetWindow = /*@__PURE__*/ b('GetWindow', '<HWND>ptr u32@GetWindowCmd -> <HWND>ptr');
161
- /** 注册窗口类;失败 → 0(ATOM)
187
+ /** 注册窗口类
188
+ * @returns 类 ATOM;失败 → 0
162
189
  * @param args_0 lpwcx WNDCLASSEXW.encode({ cbSize: WNDCLASSEXW.size, ... }).ptr(见 structs.ts) */
163
- export const RegisterClassEx = /*@__PURE__*/ b('RegisterClassExW', '<BYTE>ptr -> u16');
190
+ export const RegisterClassEx = /*@__PURE__*/ b('RegisterClassExW', '<WNDCLASSEXW>ptr -> u16', { WNDCLASSEXW });
164
191
  // ============ 焦点 / 激活 ============
165
- /** 设输入焦点;返回先前焦点窗口
192
+ /** 设输入焦点
193
+ * @returns 先前焦点窗口
166
194
  * @param args_0 hWnd 接收焦点的窗口 */
167
195
  export const SetFocus = /*@__PURE__*/ b('SetFocus', '<HWND>ptr -> <HWND>ptr');
168
- /** 取调用线程输入焦点;无 → NULL */
196
+ /** 取调用线程输入焦点
197
+ * @returns 焦点窗口句柄;无 → NULL */
169
198
  export const GetFocus = /*@__PURE__*/ b('GetFocus', ' -> <HWND>ptr');
170
- /** 取调用线程激活窗口;无 → NULL */
199
+ /** 取调用线程激活窗口
200
+ * @returns 激活窗口句柄;无 → NULL */
171
201
  export const GetActiveWindow = /*@__PURE__*/ b('GetActiveWindow', ' -> <HWND>ptr');
172
- /** 设调用线程激活窗口;返回先前窗口
202
+ /** 设调用线程激活窗口
203
+ * @returns 先前窗口
173
204
  * @param args_0 hWnd */
174
205
  export const SetActiveWindow = /*@__PURE__*/ b('SetActiveWindow', '<HWND>ptr -> <HWND>ptr');
175
206
  // ============ 消息循环 ============
176
- /** 取消息(阻塞式,-1 = 出错、0 = WM_QUIT、>0 = 有消息);分发前先 TranslateMessage
177
- * @param args_0 lpMsg MSG 出参缓冲(MSG.alloc().ptr 或自备 buffer)
207
+ /** 取消息(阻塞式);分发前先 TranslateMessage
208
+ * @returns -1 = 出错、0 = WM_QUIT、>0 = 有消息
209
+ * @param args_0 lpMsg MSG 出参缓冲(MSG.alloc().ptr,品牌位不收裸 PAB)
178
210
  * @param args_1 hWndFilter 窗口过滤,可 NULL
179
211
  * @param args_2 wMsgFilterMin 消息下限,0 = 不过滤
180
212
  * @param args_3 wMsgFilterMax 消息上限,0 = 不过滤 */
181
- export const GetMessage = /*@__PURE__*/ b('GetMessageW', '<BYTE>ptr <HWND>ptr u32 u32 -> i32');
182
- /** 非阻塞查消息;有消息 → 非 0
213
+ export const GetMessage = /*@__PURE__*/ b('GetMessageW', '<MSG>ptr <HWND>ptr u32 u32 -> i32');
214
+ /** 非阻塞查消息
215
+ * @returns 有消息 → 非 0
183
216
  * @param args_0 lpMsg MSG 出参缓冲
184
217
  * @param args_1 hWndFilter 窗口过滤,可 NULL
185
218
  * @param args_2 wMsgFilterMin 消息下限,0 = 不过滤
186
219
  * @param args_3 wMsgFilterMax 消息上限,0 = 不过滤
187
220
  * @param args_4 wRemoveMsg PM_NOREMOVE(0) / PM_REMOVE(1) */
188
- export const PeekMessage = /*@__PURE__*/ b('PeekMessageW', '<BYTE>ptr <HWND>ptr u32 u32 u32 -> i32');
189
- /** 把 WM_KEYDOWN/UP 转成字符消息(翻译结果留在队列);可翻译 → 非 0
221
+ export const PeekMessage = /*@__PURE__*/ b('PeekMessageW', '<MSG>ptr <HWND>ptr u32 u32 u32 -> i32');
222
+ /** 把 WM_KEYDOWN/UP 转成字符消息(翻译结果留在队列)
223
+ * @returns 可翻译 → 非 0
190
224
  * @param args_0 lpMsg 取到的 MSG 缓冲(GetMessage/PeekMessage 的出参) */
191
- export const TranslateMessage = /*@__PURE__*/ b('TranslateMessage', '<BYTE>ptr -> i32');
192
- /** 分发 MSG 给窗口过程;返回处理结果(0 保真,有符号读)
225
+ export const TranslateMessage = /*@__PURE__*/ b('TranslateMessage', '<MSG>ptr -> i32', { MSG });
226
+ /** 分发 MSG 给窗口过程
227
+ * @returns 处理结果(0 保真,有符号读)
193
228
  * @param args_0 lpMsg MSG 缓冲(GetMessage/PeekMessage 的出参) */
194
- export const DispatchMessage = /*@__PURE__*/ b('DispatchMessageW', '<BYTE>ptr -> <>ptr');
195
- /** 异步投递消息到窗口线程队列;成功 → 非 0
229
+ export const DispatchMessage = /*@__PURE__*/ b('DispatchMessageW', '<MSG>ptr -> <>ptr', { MSG });
230
+ /** 异步投递消息到窗口线程队列
231
+ * @returns 成功 → 非 0
196
232
  * @param args_0 hWnd 目标窗口
197
233
  * @param args_1 Msg 消息号(WM_*)
198
234
  * @param args_2 wParam 消息参数(混合位)
199
235
  * @param args_3 lParam 消息参数(混合位) */
200
236
  export const PostMessage = /*@__PURE__*/ b('PostMessageW', '<HWND>ptr u32@AnyMsg <>ptr <>ptr -> i32');
201
- /** 同步发送消息并等窗口过程处理;返回处理结果(0 保真,有符号读)
237
+ /** 同步发送消息并等窗口过程处理
238
+ * @returns 处理结果(0 保真,有符号读)
202
239
  * @param args_0 hWnd 目标窗口
203
240
  * @param args_1 Msg 消息号(WM_*)
204
241
  * @param args_2 wParam 消息参数(整数或缓冲指针)
@@ -207,187 +244,241 @@ export const SendMessage = /*@__PURE__*/ b('SendMessageW', '<HWND>ptr u32@AnyMsg
207
244
  /** 退出消息循环(投递 WM_QUIT,wParam = 退出码)
208
245
  * @param args_0 nExitCode 退出码 */
209
246
  export const PostQuitMessage = /*@__PURE__*/ b('PostQuitMessage', 'i32 -> void');
210
- /** 默认窗口过程(未处理消息的兜底);返回处理结果(0 保真,有符号读)
247
+ /** 默认窗口过程(未处理消息的兜底)
248
+ * @returns 处理结果(0 保真,有符号读)
211
249
  * @param args_0 hWnd
212
250
  * @param args_1 Msg 消息号
213
251
  * @param args_2 wParam 消息参数
214
252
  * @param args_3 lParam 消息参数 */
215
253
  export const DefWindowProc = /*@__PURE__*/ b('DefWindowProcW', '<HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr');
216
254
  /** 调用窗口过程(wndProc = GetWindowLongPtr(GWLP_WNDPROC) 读回的过程指针——无品牌混合位,
217
- * 仅对本线程窗口调用);返回处理结果(0 保真,有符号读)
255
+ * 仅对本线程窗口调用)
256
+ * @returns 处理结果(0 保真,有符号读)
218
257
  * @param args_0 lpPrevWndFunc 原窗口过程指针
219
258
  * @param args_1 hWnd
220
259
  * @param args_2 Msg 消息号
221
260
  * @param args_3 wParam 消息参数
222
261
  * @param args_4 lParam 消息参数 */
223
262
  export const CallWindowProc = /*@__PURE__*/ b('CallWindowProcW', '<>ptr <HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr');
224
- /** 注册系统级唯一消息 ID(按字符串比较);失败 → 0
263
+ /** 注册系统级唯一消息 ID(按字符串比较)
264
+ * @returns 消息 ID;失败 → 0
225
265
  * @param args_0 lpString 消息名 string */
226
266
  export const RegisterWindowMessage = /*@__PURE__*/ b('RegisterWindowMessageW', '<WCHAR>ptr -> u32');
227
267
  // ============ 绘制 / DC ============
228
- /** 取窗口 DC(hWnd 传 NULL → 桌面窗口);失败 → NULL;用完必须 ReleaseDC 配对
268
+ /** 取窗口 DC(hWnd 传 NULL → 桌面窗口);用完必须 ReleaseDC 配对
269
+ * @returns DC;失败 → NULL
229
270
  * @param args_0 hWnd NULL = 桌面窗口 */
230
271
  export const GetDC = /*@__PURE__*/ b('GetDC', '<HWND>ptr -> <HDC>ptr');
231
- /** 归还 GetDC/GetWindowDC 取的 DC(首参窗口句柄、第二参 DC,误传编译不过);成功 → 非 0
272
+ /** 归还 GetDC/GetWindowDC 取的 DC(首参窗口句柄、第二参 DC,误传编译不过)
273
+ * @returns 成功 → 非 0
232
274
  * @param args_0 hWnd 取 DC 时的窗口句柄
233
275
  * @param args_1 hdc 要归还的 DC */
234
276
  export const ReleaseDC = /*@__PURE__*/ b('ReleaseDC', '<HWND>ptr <HDC>ptr! -> i32');
235
- /** 让窗口把自己画进 hdcBlt(可截被遮挡 / 最小化的窗口;位图须按整窗尺寸建,从 (0,0) 填满);
236
- * 成功 → 非 0
277
+ /** 让窗口把自己画进 hdcBlt(可截被遮挡 / 最小化的窗口;位图须按整窗尺寸建,从 (0,0) 填满)
278
+ * @returns 成功 → 非 0
237
279
  * @param args_0 hWnd 被截窗口
238
280
  * @param args_1 hdcBlt 目标 DC
239
281
  * @param args_2 nFlags PW_* 标志(PW_CLIENTONLY=1/PW_RENDERFULLCONTENT=2,Win8.1+),XP/Win7 传 0 */
240
282
  export const PrintWindow = /*@__PURE__*/ b('PrintWindow', '<HWND>ptr <HDC>ptr! u32 -> i32');
241
- /** 取整个窗口(含边框标题)DC;失败 → NULL,配对 ReleaseDC
283
+ /** 取整个窗口(含边框标题)DC;配对 ReleaseDC
284
+ * @returns DC;失败 → NULL
242
285
  * @param args_0 hWnd */
243
286
  export const GetWindowDC = /*@__PURE__*/ b('GetWindowDC', '<HWND>ptr -> <HDC>ptr');
244
- /** 开始重绘;返回 DC,配对 EndPaint
287
+ /** 开始重绘;配对 EndPaint
288
+ * @returns DC
245
289
  * @param args_0 hWnd 重绘窗口
246
290
  * @param args_1 lpPaint 出参槽,PAINTSTRUCT.alloc().ptr(见 structs.ts) */
247
- export const BeginPaint = /*@__PURE__*/ b('BeginPaint', '<HWND>ptr <BYTE>ptr -> <HDC>ptr');
248
- /** 结束重绘(传 BeginPaint 同一 buffer);成功 → 非 0
291
+ export const BeginPaint = /*@__PURE__*/ b('BeginPaint', '<HWND>ptr <PAINTSTRUCT>ptr -> <HDC>ptr');
292
+ /** 结束重绘(传 BeginPaint 同一 buffer)
293
+ * @returns 成功 → 非 0
249
294
  * @param args_0 hWnd 重绘窗口
250
295
  * @param args_1 lpPaint BeginPaint 同一 PAINTSTRUCT 缓冲 */
251
- export const EndPaint = /*@__PURE__*/ b('EndPaint', '<HWND>ptr <BYTE>ptr -> i32');
252
- /** 文本排版绘制;返回文本行高
296
+ export const EndPaint = /*@__PURE__*/ b('EndPaint', '<HWND>ptr <PAINTSTRUCT>ptr -> i32');
297
+ /** 文本排版绘制
298
+ * @returns 文本行高
253
299
  * @param args_0 hdc 目标 DC
254
300
  * @param args_1 lpchText 文本 string(自动 UTF-16 编码)
255
301
  * @param args_2 cchText 字符数(-1 = 自动算到 NUL)
256
302
  * @param args_3 lpRect 矩形(双向不注册 encoder;CALCRECT 就地写回:RECT.encode(初值) 传 .ptr、decode 读回)
257
303
  * @param args_4 uFormat DT_* 排版标志(gui.DrawTextFlag) */
258
304
  export const DrawText = /*@__PURE__*/ b('DrawTextW', '<HDC>ptr! <WCHAR>ptr i32 <RECT>ptr i32 -> i32');
259
- /** 用画刷填充矩形;返回填充高度
305
+ /** 用画刷填充矩形
306
+ * @returns 填充高度
260
307
  * @param args_0 hdc 目标 DC
261
308
  * @param args_1 lprc 矩形(DeepPartial RECT 对象或 RECT.alloc().ptr)
262
309
  * @param args_2 hbr 画刷句柄(无品牌 <>ptr) */
263
310
  export const FillRect = /*@__PURE__*/ b('FillRect', '<HDC>ptr! <RECT>ptr <>ptr -> i32', { RECT });
264
- /** 标记窗口区域失效(触发重绘);成功 → 非 0
311
+ /** 用画刷画 1px 空心矩形边框(只描边不填充);成功与否请以像素/后续状态断言
312
+ * @returns 返回值 Windows 版本间不可靠
313
+ * @param args_1 lprc 矩形(DeepPartial RECT 对象或 RECT.alloc().ptr)
314
+ * @param args_2 hbr 画刷句柄(CreateSolidBrush 等返回的 <>ptr 族内互传) */
315
+ export const FrameRect = /*@__PURE__*/ b('FrameRect', '<HDC>ptr! <RECT>ptr <>ptr -> i32', { RECT });
316
+ /** 矩形区域逐像素按位取反(白→黑、红→青;再反一次可逆还原)
317
+ * @returns 成功 → 非 0
318
+ * @param args_1 lprc 矩形(DeepPartial RECT 对象或 RECT.alloc().ptr) */
319
+ export const InvertRect = /*@__PURE__*/ b('InvertRect', '<HDC>ptr! <RECT>ptr -> i32', { RECT });
320
+ /** 标记窗口区域失效(触发重绘)
321
+ * @returns 成功 → 非 0
265
322
  * @param args_0 hWnd
266
323
  * @param args_1 lpRect 失效区域(DeepPartial RECT / .ptr / NULL = 全窗)
267
324
  * @param args_2 bErase 非 0 先擦背景 */
268
325
  export const InvalidateRect = /*@__PURE__*/ b('InvalidateRect', '<HWND>ptr <RECT>ptr i32 -> i32', { RECT });
269
- /** 立即重绘失效区域;成功 → 非 0
326
+ /** 立即重绘失效区域
327
+ * @returns 成功 → 非 0
270
328
  * @param args_0 hWnd */
271
329
  export const UpdateWindow = /*@__PURE__*/ b('UpdateWindow', '<HWND>ptr -> i32');
272
330
  // ============ 光标 / 坐标 / 捕获 ============
273
- /** 设光标形状(误传 HWND 编译不过);返回先前光标
331
+ /** 设光标形状(误传 HWND 编译不过)
332
+ * @returns 先前光标
274
333
  * @param args_0 hCursor 光标句柄 */
275
334
  export const SetCursor = /*@__PURE__*/ b('SetCursor', '<HCURSOR>ptr -> <HCURSOR>ptr');
276
- /** 加载光标资源;失败 → NULL
335
+ /** 加载光标资源
336
+ * @returns 光标句柄;失败 → NULL
277
337
  * @param args_0 hInstance 模块句柄,NULL = 系统光标
278
338
  * @param args_1 lpCursorName MAKEINTRESOURCE 整数(如 32512 = IDC_ARROW)直传 */
279
339
  export const LoadCursor = /*@__PURE__*/ b('LoadCursorW', '<HMODULE>ptr <>ptr -> <HCURSOR>ptr');
280
- /** 取光标屏幕坐标;成功 → 非 0
340
+ /** 取光标屏幕坐标
341
+ * @returns 成功 → 非 0
281
342
  * @param args_0 lpPoint 出参槽,传 POINT.alloc().ptr、POINT.decode 读回 */
282
343
  export const GetCursorPos = /*@__PURE__*/ b('GetCursorPos', '<POINT>ptr -> i32');
283
- /** 设光标屏幕坐标;成功 → 非 0
344
+ /** 设光标屏幕坐标
345
+ * @returns 成功 → 非 0
284
346
  * @param args_0 x 屏幕 x
285
347
  * @param args_1 y 屏幕 y */
286
348
  export const SetCursorPos = /*@__PURE__*/ b('SetCursorPos', 'i32 i32 -> i32');
287
- /** 显示/隐藏光标(计数式);返回新计数
349
+ /** 显示/隐藏光标(计数式)
350
+ * @returns 新计数
288
351
  * @param args_0 bShow >0 显示(内部计数),<0 隐藏 */
289
352
  export const ShowCursor = /*@__PURE__*/ b('ShowCursor', 'i32 -> i32');
290
- /** 屏幕坐标 → 客户区坐标(就地更新,双向不注册 encoder);成功 → 非 0
353
+ /** 屏幕坐标 → 客户区坐标(就地更新,双向不注册 encoder)
354
+ * @returns 成功 → 非 0
291
355
  * @param args_0 hWnd 目标窗口
292
356
  * @param args_1 lpPoint 就地更新的 POINT(encode(初值) 传 .ptr、decode 读回) */
293
357
  export const ScreenToClient = /*@__PURE__*/ b('ScreenToClient', '<HWND>ptr <POINT>ptr -> i32');
294
- /** 客户区坐标 → 屏幕坐标(就地更新,同上);成功 → 非 0
358
+ /** 客户区坐标 → 屏幕坐标(就地更新,同上)
359
+ * @returns 成功 → 非 0
295
360
  * @param args_0 hWnd 源窗口
296
361
  * @param args_1 lpPoint 就地更新的 POINT(同 ScreenToClient) */
297
362
  export const ClientToScreen = /*@__PURE__*/ b('ClientToScreen', '<HWND>ptr <POINT>ptr -> i32');
298
- /** 批量坐标系转换;返回偏移差的低/高 16 位打包值
363
+ /** 批量坐标系转换
364
+ * @returns 偏移差的低/高 16 位打包值
299
365
  * @param args_0 hWndFrom 源窗口
300
366
  * @param args_1 hWndTo 目标窗口
301
367
  * @param args_2 lpPoints POINT 数组缓冲
302
368
  * @param args_3 cPoints 点数 */
303
369
  export const MapWindowPoints = /*@__PURE__*/ b('MapWindowPoints', '<HWND>ptr <HWND>ptr <BYTE>ptr u32 -> i32');
304
- /** 取当前捕获鼠标的窗口;无 → NULL */
370
+ /** 取当前捕获鼠标的窗口
371
+ * @returns 窗口句柄;无 → NULL */
305
372
  export const GetCapture = /*@__PURE__*/ b('GetCapture', ' -> <HWND>ptr');
306
- /** 捕获鼠标输入到窗口;返回先前捕获窗口
373
+ /** 捕获鼠标输入到窗口
374
+ * @returns 先前捕获窗口
307
375
  * @param args_0 hWnd 接收捕获的窗口 */
308
376
  export const SetCapture = /*@__PURE__*/ b('SetCapture', '<HWND>ptr -> <HWND>ptr');
309
- /** 释放鼠标捕获;成功 → 非 0 */
377
+ /** 释放鼠标捕获
378
+ * @returns 成功 → 非 0 */
310
379
  export const ReleaseCapture = /*@__PURE__*/ b('ReleaseCapture', ' -> i32');
311
380
  // ============ 键盘 / 输入 ============
312
- /** 取虚拟键状态(SHORT:高位 0x8000 = 按下、低位 = 自上次调用的切换)
381
+ /** 取虚拟键状态
382
+ * @returns SHORT:高位 0x8000 = 按下、低位 = 自上次调用的切换
313
383
  * @param args_0 nVirtKey 虚拟键码(VK_*) */
314
384
  export const GetKeyState = /*@__PURE__*/ b('GetKeyState', 'i32 -> i32');
315
- /** 取虚拟键全局按下状态(高位 0x8000 = 当前按下)
385
+ /** 取虚拟键全局按下状态
386
+ * @returns 高位 0x8000 = 当前按下
316
387
  * @param args_0 nVirtKey 虚拟键码(VK_*) */
317
388
  export const GetAsyncKeyState = /*@__PURE__*/ b('GetAsyncKeyState', 'i32 -> i32');
318
- /** 取全部 256 键状态;成功 → 非 0
389
+ /** 取全部 256 键状态
390
+ * @returns 成功 → 非 0
319
391
  * @param args_0 lpKeyState 出参槽,自备 256 字节 buffer */
320
392
  export const GetKeyboardState = /*@__PURE__*/ b('GetKeyboardState', '<BYTE>ptr -> i32');
321
- /** 字符 → 虚拟键+修饰键;返回 SHORT(低字节 VK、高位 shift/ctrl/alt 掩码),无 → -1
393
+ /** 字符 → 虚拟键+修饰键
394
+ * @returns SHORT(低字节 VK、高位 shift/ctrl/alt 掩码),无 → -1
322
395
  * @param args_0 ch 字符码(如 65 = 'A') */
323
396
  export const VkKeyScan = /*@__PURE__*/ b('VkKeyScanW', 'u32 -> i32');
324
397
  // ============ 计时器 ============
325
- /** 设定时器(hWnd/id 传 NULL/0 = 自动分配 id,返回值读回;lpTimerFunc 传 NULL 用 WM_TIMER);失败 → 0
398
+ /** 设定时器(hWnd/id 传 NULL/0 = 自动分配 id;lpTimerFunc 传 NULL 用 WM_TIMER)
399
+ * @returns 定时器 ID(自动分配时从返回值读回);失败 → 0
326
400
  * @param args_0 hWnd 关联窗口,可 NULL
327
401
  * @param args_1 id 定时器 ID(0 = 自动分配)
328
402
  * @param args_2 uElapse 间隔毫秒
329
403
  * @param args_3 lpTimerFunc 回调指针(closure().ptr),NULL = WM_TIMER 消息 */
330
404
  export const SetTimer = /*@__PURE__*/ b('SetTimer', '<HWND>ptr <>ptr u32 <>ptr -> <>ptr');
331
- /** 杀定时器(id 用 SetTimer 返回值);成功 → 非 0
405
+ /** 杀定时器(id 用 SetTimer 返回值)
406
+ * @returns 成功 → 非 0
332
407
  * @param args_0 hWnd 关联窗口,可 NULL
333
408
  * @param args_1 id 定时器 ID(SetTimer 返回值) */
334
409
  export const KillTimer = /*@__PURE__*/ b('KillTimer', '<HWND>ptr <>ptr -> i32');
335
410
  // ============ 剪贴板 ============
336
- /** 打开剪贴板;成功 → 非 0,配对 CloseClipboard
411
+ /** 打开剪贴板;配对 CloseClipboard
412
+ * @returns 成功 → 非 0
337
413
  * @param args_0 hWnd 拥有窗口,可 NULL */
338
414
  export const OpenClipboard = /*@__PURE__*/ b('OpenClipboard', '<HWND>ptr -> i32');
339
- /** 关闭剪贴板;成功 → 非 0 */
415
+ /** 关闭剪贴板
416
+ * @returns 成功 → 非 0 */
340
417
  export const CloseClipboard = /*@__PURE__*/ b('CloseClipboard', ' -> i32');
341
- /** 清空剪贴板(须先 OpenClipboard);成功 → 非 0 */
418
+ /** 清空剪贴板(须先 OpenClipboard)
419
+ * @returns 成功 → 非 0 */
342
420
  export const EmptyClipboard = /*@__PURE__*/ b('EmptyClipboard', ' -> i32');
343
- /** 取剪贴板数据句柄(须先 OpenClipboard + 有数据);无 → NULL
421
+ /** 取剪贴板数据(须先 OpenClipboard + 有数据)
422
+ * @returns 数据句柄;无 → NULL
344
423
  * @param args_0 uFormat 剪贴板格式(CF_* 或 RegisterClipboardFormat 返回值) */
345
424
  export const GetClipboardData = /*@__PURE__*/ b('GetClipboardData', 'u32 -> <HGLOBAL>ptr');
346
- /** 放数据进剪贴板;成功 → 非 0
425
+ /** 放数据进剪贴板
426
+ * @returns 成功 → 非 0
347
427
  * @param args_0 uFormat 剪贴板格式
348
428
  * @param args_1 hMem 全局内存句柄(所有权移交系统后勿再用) */
349
429
  export const SetClipboardData = /*@__PURE__*/ b('SetClipboardData', 'u32 <HGLOBAL>ptr -> <HGLOBAL>ptr');
350
- /** 注册自定义剪贴板格式 ID;失败 → 0
430
+ /** 注册自定义剪贴板格式 ID
431
+ * @returns 格式 ID;失败 → 0
351
432
  * @param args_0 lpszFormat 格式名 string */
352
433
  export const RegisterClipboardFormat = /*@__PURE__*/ b('RegisterClipboardFormatW', '<WCHAR>ptr -> u32');
353
- /** 剪贴板是否有指定格式数据;有 → 非 0
434
+ /** 剪贴板是否有指定格式数据
435
+ * @returns 有 → 非 0
354
436
  * @param args_0 format 剪贴板格式(CF_*) */
355
437
  export const IsClipboardFormatAvailable = /*@__PURE__*/ b('IsClipboardFormatAvailable', 'u32 -> i32');
356
438
  // ============ 菜单 ============
357
- /** 取窗口菜单;无菜单 → NULL
439
+ /** 取窗口菜单
440
+ * @returns 菜单句柄;无菜单 → NULL
358
441
  * @param args_0 hWnd */
359
442
  export const GetMenu = /*@__PURE__*/ b('GetMenu', '<HWND>ptr -> <HMENU>ptr');
360
- /** 设/清窗口菜单;成功 → 非 0,改后需 DrawMenuBar
443
+ /** 设/清窗口菜单;改后需 DrawMenuBar
444
+ * @returns 成功 → 非 0
361
445
  * @param args_0 hWnd
362
446
  * @param args_1 hMenu 新菜单,NULL 清除 */
363
447
  export const SetMenu = /*@__PURE__*/ b('SetMenu', '<HWND>ptr <HMENU>ptr -> i32');
364
- /** 重画菜单栏;成功 → 非 0
448
+ /** 重画菜单栏
449
+ * @returns 成功 → 非 0
365
450
  * @param args_0 hWnd */
366
451
  export const DrawMenuBar = /*@__PURE__*/ b('DrawMenuBar', '<HWND>ptr -> i32');
367
- /** 追加菜单项;成功 → 非 0
452
+ /** 追加菜单项
453
+ * @returns 成功 → 非 0
368
454
  * @param args_0 hMenu 目标菜单
369
455
  * @param args_1 uFlags MF_* 标志(MF_STRING/MF_SEPARATOR/MF_POPUP 等)
370
456
  * @param args_2 uIDNewItem 命令 ID 或子菜单句柄(混合位)
371
457
  * @param args_3 lpNewItem 菜单项文本 string 或 NULL */
372
458
  export const AppendMenu = /*@__PURE__*/ b('AppendMenuW', '<HMENU>ptr u32 <>ptr <WCHAR>ptr -> i32');
373
- /** 销毁菜单(误传 HWND 编译不过);成功 → 非 0
459
+ /** 销毁菜单(误传 HWND 编译不过)
460
+ * @returns 成功 → 非 0
374
461
  * @param args_0 hMenu */
375
462
  export const DestroyMenu = /*@__PURE__*/ b('DestroyMenu', '<HMENU>ptr -> i32');
376
- /** 设菜单项勾选状态;返回先前状态(0xFFFFFFFF = 失败)
463
+ /** 设菜单项勾选状态
464
+ * @returns 先前状态(0xFFFFFFFF = 失败)
377
465
  * @param args_0 hMenu
378
466
  * @param args_1 uIDItem 菜单项 ID 或位置(依 uFlags MF_BYPOSITION)
379
467
  * @param args_2 uCheck MF_CHECKED/MF_UNCHECKED 等 */
380
468
  export const CheckMenuItem = /*@__PURE__*/ b('CheckMenuItem', '<HMENU>ptr u32 u32 -> u32');
381
- /** 启用/禁用/灰化菜单项;返回先前状态
469
+ /** 启用/禁用/灰化菜单项
470
+ * @returns 先前状态
382
471
  * @param args_0 hMenu
383
472
  * @param args_1 uIDItem 菜单项 ID 或位置
384
473
  * @param args_2 uEnable MF_ENABLED/MF_GRAYED/MF_DISABLED 等 */
385
474
  export const EnableMenuItem = /*@__PURE__*/ b('EnableMenuItem', '<HMENU>ptr u32 u32 -> i32');
386
- /** 取子菜单(按位置);无 → NULL(出入参同型)
475
+ /** 取子菜单(按位置)
476
+ * @returns 子菜单句柄;无 → NULL(出入参同型)
387
477
  * @param args_0 hMenu 父菜单
388
478
  * @param args_1 nPos 子菜单位置索引 */
389
479
  export const GetSubMenu = /*@__PURE__*/ b('GetSubMenu', '<HMENU>ptr i32 -> <HMENU>ptr');
390
- /** 弹出跟踪菜单;返回菜单项命令 ID 或 0
480
+ /** 弹出跟踪菜单
481
+ * @returns 菜单项命令 ID 或 0
391
482
  * @param args_0 hMenu 弹出菜单
392
483
  * @param args_1 uFlags TPM_* 标志
393
484
  * @param args_2 x 屏幕 x
@@ -396,28 +487,33 @@ export const GetSubMenu = /*@__PURE__*/ b('GetSubMenu', '<HMENU>ptr i32 -> <HMEN
396
487
  * @param args_5 prcRect 点击区矩形(DeepPartial RECT / .ptr / NULL)
397
488
  * @param args_6 hdc 参考 DC,可 NULL */
398
489
  export const TrackPopupMenu = /*@__PURE__*/ b('TrackPopupMenu', '<HMENU>ptr u32 i32 i32 i32 <RECT>ptr <HDC>ptr -> i32', { RECT });
399
- /** 创建弹出菜单;失败 → NULL,配对 DestroyMenu */
490
+ /** 创建弹出菜单;配对 DestroyMenu
491
+ * @returns 菜单句柄;失败 → NULL */
400
492
  export const CreatePopupMenu = /*@__PURE__*/ b('CreatePopupMenu', ' -> <HMENU>ptr');
401
493
  // ============ 滚动条 ============
402
- /** 设滚动参数;返回滑块位置
494
+ /** 设滚动参数
495
+ * @returns 滑块位置
403
496
  * @param args_0 hWnd
404
497
  * @param args_1 nBar 滚动条(SB_HORZ=0/SB_VERT=1/SB_CTL=2)
405
498
  * @param args_2 lpScrollInfo DeepPartial SCROLLINFO(cbSize 必须显式给 SCROLLINFO.size——Win32
406
499
  * 结构自描述要求,缺省跳过帮不了;fMask = SIF_* 决定写哪些项)
407
500
  * @param args_3 redraw 非 0 立即重画 */
408
501
  export const SetScrollInfo = /*@__PURE__*/ b('SetScrollInfo', '<HWND>ptr u32 <SCROLLINFO>ptr i32 -> i32', { SCROLLINFO });
409
- /** 取滚动参数(双向不注册 encoder);成功 → 非 0
502
+ /** 取滚动参数(双向不注册 encoder)
503
+ * @returns 成功 → 非 0
410
504
  * @param args_0 hWnd
411
505
  * @param args_1 nBar 滚动条(SB_*)
412
506
  * @param args_2 lpScrollInfo SCROLLINFO.encode({cbSize, fMask}) 传 .ptr、decode 读回 */
413
507
  export const GetScrollInfo = /*@__PURE__*/ b('GetScrollInfo', '<HWND>ptr u32 <SCROLLINFO>ptr -> i32');
414
- /** 显示/隐藏滚动条;成功 → 非 0
508
+ /** 显示/隐藏滚动条
509
+ * @returns 成功 → 非 0
415
510
  * @param args_0 hWnd
416
511
  * @param args_1 bar 滚动条(0=HORZ 1=VERT 3=BOTH)
417
512
  * @param args_2 show 非 0 显示 */
418
513
  export const ShowScrollBar = /*@__PURE__*/ b('ShowScrollBar', '<HWND>ptr u32 i32 -> i32');
419
514
  // ============ 对话框 ============
420
- /** 消息框(仅在确实要弹窗时调用;MB_* 常量见 MSDN);返回按钮 ID
515
+ /** 消息框(仅在确实要弹窗时调用;MB_* 常量见 MSDN)
516
+ * @returns 按钮 ID
421
517
  * @param args_0 hWnd 父窗口,可 NULL
422
518
  * @param args_1 lpText 正文 string
423
519
  * @param args_2 lpCaption 标题 string
@@ -425,7 +521,8 @@ export const ShowScrollBar = /*@__PURE__*/ b('ShowScrollBar', '<HWND>ptr u32 i32
425
521
  export const MessageBox = /*@__PURE__*/ b('MessageBoxW', '<HWND>ptr <WCHAR>ptr <WCHAR>ptr u32 -> i32');
426
522
  // ============ 图像 ============
427
523
  /** 按名加载图像(string 自动编码;uType/fuLoad 用 Win32 真值——与 gui.ImageType 枚举当前值
428
- * 不同);失败 → 0
524
+ * 不同)
525
+ * @returns 图像句柄;失败 → 0
429
526
  * @param args_0 hinst 模块句柄,NULL = 系统资源或 .ico 文件
430
527
  * @param args_1 name 图像名 string(资源名或文件路径)
431
528
  * @param args_2 uType IMAGE_* 真值(BITMAP=0/CURSOR=1/ICON=2)
@@ -434,6 +531,7 @@ export const MessageBox = /*@__PURE__*/ b('MessageBoxW', '<HWND>ptr <WCHAR>ptr <
434
531
  * @param args_5 fuLoad LR_* 标志(LR_LOADFROMFILE=0x10/LR_SHARED=0x8000,系统 IDI 需 SHARED) */
435
532
  export const LoadImage = /*@__PURE__*/ b('LoadImageW', '<HMODULE>ptr <WCHAR>ptr u32 i32 i32 u32 -> <>ptr');
436
533
  /** 按资源 ID 序数加载图像(name 直传 MAKEINTRESOURCE 整数);其余同 LoadImage
534
+ * @returns 图像句柄;失败 → 0
437
535
  * @param args_0 hinst 模块句柄
438
536
  * @param args_1 name 资源 ID 序数(如 IDI_APPLICATION=32512)
439
537
  * @param args_2 uType IMAGE_* 真值
@@ -443,26 +541,31 @@ export const LoadImage = /*@__PURE__*/ b('LoadImageW', '<HMODULE>ptr <WCHAR>ptr
443
541
  export const LoadImageOrdinal = /*@__PURE__*/ b('LoadImageW', '<HMODULE>ptr <>ptr u32 i32 i32 u32 -> <>ptr');
444
542
  // ============ 杂项高频 ============
445
543
  /** 取系统度量
544
+ * @returns 度量值
446
545
  * @param args_0 nIndex 度量索引(SM_CXSCREEN=0/SM_CYSCREEN=1 等 SM_*) */
447
546
  export const GetSystemMetrics = /*@__PURE__*/ b('GetSystemMetrics', 'i32 -> i32');
448
- /** 读/写系统参数;成功 → 非 0
547
+ /** 读/写系统参数
548
+ * @returns 成功 → 非 0
449
549
  * @param args_0 uiAction SPI_* 操作码
450
550
  * @param args_1 uiParam 参数(随操作而定,常为缓冲大小或 0)
451
551
  * @param args_2 pvParam 数据 buffer(如 SPI_GETNONCLIENTMETRICS 的缓冲)
452
552
  * @param args_3 fWinIni SPIF_* 写入标志(0 = 仅当前会话) */
453
553
  export const SystemParametersInfo = /*@__PURE__*/ b('SystemParametersInfoW', 'u32 u32 <BYTE>ptr u32 -> i32');
454
- /** 枚举顶层窗口;全枚举完 → 非 0
554
+ /** 枚举顶层窗口
555
+ * @returns 全枚举完 → 非 0
455
556
  * @param args_0 lpEnumFunc 回调指针(closure(stdcall)().ptr),回调返 0 停止
456
557
  * @param args_1 lParam 透传给回调的附加值(常传 0) */
457
558
  export const EnumWindows = /*@__PURE__*/ b('EnumWindows', '<>ptr <>ptr -> i32');
458
559
  // ============ 显示模式(分辨率/刷新率)============
459
- /** 枚举显示模式(iDevNum 从 0 递增直到返回 0);找到 → 非 0
560
+ /** 枚举显示模式(iDevNum 从 0 起逐个枚举)
561
+ * @returns 找到 → 非 0;枚举尽 → 0
460
562
  * @param args_0 lpszDeviceName 设备名,NULL = 主显示设备
461
563
  * @param args_1 iDevNum 模式序号(0 起递增;-1 = 当前设置)
462
564
  * @param args_2 lpDevMode DEVMODEW 出参缓冲(双向不注册 encoder,只收 def 的 .ptr;
463
565
  * encode({ dmSize: DEVMODEW.size }).ptr 传入、decode 读回) */
464
566
  export const EnumDisplaySettings = /*@__PURE__*/ b('EnumDisplaySettingsW', '<WCHAR>ptr u32 <DEVMODEW>ptr -> i32');
465
- /** 改显示模式;返回 DISP_CHANGE_*(0 = DISP_CHANGE_SUCCESSFUL)
567
+ /** 改显示模式
568
+ * @returns DISP_CHANGE_*(0 = DISP_CHANGE_SUCCESSFUL)
466
569
  * @param args_0 lpDevMode DEVMODEW 缓冲(须先枚举/预置 dmSize+dmFields,
467
570
  * DM_PELSWIDTH|DM_PELSHEIGHT 等决定生效项;收 encode(...).ptr)
468
571
  * @param args_1 dwFlags CDS_* 标志(0 = 仅当前会话、CDS_UPDATEREGISTRY = 写注册表持久化) */