quickwin 1.3.0 → 2.0.0

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 (143) hide show
  1. package/README.en.md +1 -2
  2. package/README.md +19 -23
  3. package/examples/PdfCanvas.js +8 -37
  4. package/examples/PdfCanvas.tsx +11 -41
  5. package/examples/exec_server.js +20054 -1423
  6. package/examples/exec_server.tsx +489 -0
  7. package/examples/exec_server_worker.js +383 -33
  8. package/examples/exec_server_worker.ts +408 -30
  9. package/examples/pdf_preview2.js +25 -82
  10. package/examples/pdf_preview2.ts +27 -84
  11. package/examples/pdf_viewer.js +1318 -1178
  12. package/examples/pdf_viewer.tsx +16 -67
  13. package/examples/setres.js +22 -47
  14. package/examples/setres.ts +23 -57
  15. package/examples/test_gallery.js +1313 -1074
  16. package/examples/test_react_lazy.js +1284 -1056
  17. package/examples/test_react_listbox.js +1283 -1055
  18. package/examples/test_root_window.js +1279 -1051
  19. package/examples/test_tab.js +1284 -1056
  20. package/lib/abort.js +70 -0
  21. package/lib/abort.ts +69 -0
  22. package/lib/certs.js +214 -0
  23. package/lib/certs.ts +224 -0
  24. package/lib/exec-log.js +15 -0
  25. package/lib/exec-log.ts +30 -0
  26. package/lib/fetch.js +37 -4
  27. package/lib/fetch.ts +35 -4
  28. package/lib/ffi/bind.js +352 -0
  29. package/lib/ffi/bind.ts +442 -0
  30. package/lib/ffi/ctype.js +168 -0
  31. package/lib/ffi/ctype.ts +331 -0
  32. package/lib/ffi/index.js +6 -0
  33. package/lib/ffi/index.ts +6 -0
  34. package/lib/ffi/struct.js +412 -0
  35. package/lib/ffi/struct.ts +664 -0
  36. package/lib/http-common.js +43 -5
  37. package/lib/http-common.ts +48 -6
  38. package/lib/http-server.js +187 -29
  39. package/lib/http-server.ts +177 -26
  40. package/lib/react-qw/components/DateTimePicker.js +18 -37
  41. package/lib/react-qw/components/Input.js +3 -10
  42. package/lib/react-qw/components/Link.js +6 -19
  43. package/lib/react-qw/components/ListView.js +49 -154
  44. package/lib/react-qw/components/PathPicker.js +28 -88
  45. package/lib/react-qw/components/ScrollView.js +15 -8
  46. package/lib/react-qw/components/Slider.js +2 -1
  47. package/lib/react-qw/components/Tab.js +6 -22
  48. package/lib/react-qw/components/Tooltip.js +10 -21
  49. package/lib/react-qw/components/TreeView.js +8 -31
  50. package/lib/react-qw/index.js +4 -2
  51. package/lib/react-qw/index.ts +4 -2
  52. package/lib/react-qw/nmhdr.js +3 -24
  53. package/lib/react-qw/nmhdr.ts +5 -30
  54. package/lib/react-qw/props.js +7 -2
  55. package/lib/react-qw/props.ts +7 -3
  56. package/lib/react-qw/reconciler.js +23 -13
  57. package/lib/react-qw/reconciler.ts +22 -13
  58. package/lib/text-measure.js +18 -23
  59. package/lib/text-measure.ts +20 -25
  60. package/lib/websocket.js +12 -2
  61. package/lib/websocket.ts +15 -2
  62. package/lib/windows/comctl32.js +18 -0
  63. package/lib/windows/comctl32.ts +20 -0
  64. package/lib/windows/comdlg32.js +7 -0
  65. package/lib/windows/comdlg32.ts +9 -0
  66. package/lib/windows/gdi32.js +90 -0
  67. package/lib/windows/gdi32.ts +97 -0
  68. package/lib/windows/kernel32.js +66 -0
  69. package/lib/windows/kernel32.ts +76 -0
  70. package/lib/windows/ntdll.js +8 -0
  71. package/lib/windows/ntdll.ts +10 -0
  72. package/lib/windows/ole32.js +7 -0
  73. package/lib/windows/ole32.ts +9 -0
  74. package/lib/windows/shell32.js +11 -0
  75. package/lib/windows/shell32.ts +14 -0
  76. package/lib/windows/structs.js +384 -0
  77. package/lib/windows/structs.ts +422 -0
  78. package/lib/windows/user32.js +469 -0
  79. package/lib/windows/user32.ts +502 -0
  80. package/package.json +1 -1
  81. package/quickwin.d.ts +22 -37
  82. package/quickwin_const.d.ts +1 -0
  83. package/qwin-nowasm-x86.exe +0 -0
  84. package/qwin-nowasm.exe +0 -0
  85. package/qwin-x86.exe +0 -0
  86. package/qwin.exe +0 -0
  87. package/test/bench_ffi_callraw.js +236 -0
  88. package/test/bench_ffi_callraw.ts +236 -0
  89. package/test/bench_ffi_overhead.js +139 -0
  90. package/test/bench_ffi_overhead.ts +141 -0
  91. package/test/bench_sendmessage.js +104 -0
  92. package/test/bench_sendmessage.ts +100 -0
  93. package/test/bench_sendmessage_nonnull.js +187 -0
  94. package/test/bench_sendmessage_nonnull.ts +188 -0
  95. package/test/run.js +12 -4
  96. package/test/run.ts +13 -5
  97. package/test/test_basic_fetch.js +8 -0
  98. package/test/test_basic_fetch.ts +9 -0
  99. package/test/test_ffi.js +25 -43
  100. package/test/test_ffi.ts +33 -52
  101. package/test/test_ffi_abi.js +235 -0
  102. package/test/test_ffi_abi.ts +218 -0
  103. package/test/test_ffi_bind.js +538 -8
  104. package/test/test_ffi_bind.ts +559 -8
  105. package/test/test_ffi_struct.js +632 -88
  106. package/test/test_ffi_struct.ts +666 -91
  107. package/test/test_ffi_struct_layout.js +495 -0
  108. package/test/test_ffi_struct_layout.ts +543 -0
  109. package/test/test_ffi_user32.js +103 -0
  110. package/test/test_ffi_user32.ts +113 -0
  111. package/test/test_ffi_windows.js +101 -0
  112. package/test/test_ffi_windows.ts +113 -0
  113. package/test/test_helper.js +8 -1
  114. package/test/test_helper.ts +9 -1
  115. package/test/test_http_import.js +18 -0
  116. package/test/test_http_import.ts +19 -0
  117. package/test/test_http_server.js +73 -1
  118. package/test/test_http_server.ts +75 -1
  119. package/test/test_ipv6.js +2 -2
  120. package/test/test_ipv6.ts +2 -2
  121. package/test/test_net_fetch.js +70 -8
  122. package/test/test_net_fetch.ts +69 -7
  123. package/test/test_net_websocket.js +1 -1
  124. package/test/test_net_websocket.ts +1 -1
  125. package/test/test_react_complex.js +1294 -1066
  126. package/test/test_react_counter.js +1284 -1056
  127. package/test/test_react_flex.js +1304 -1069
  128. package/test/test_react_hidden.js +1287 -1059
  129. package/test/test_react_listview_link.js +1284 -1056
  130. package/test/test_react_notify.js +18534 -0
  131. package/test/test_react_render.js +1284 -1056
  132. package/test/test_wolfssl_read.js +3 -2
  133. package/test/test_wolfssl_read.ts +3 -1
  134. package/test/test_worker_net.js +35 -17
  135. package/test/test_worker_net.ts +27 -15
  136. package/tsconfig.json +1 -1
  137. package/examples/exec_server.ts +0 -80
  138. package/lib/ffi-bind.js +0 -85
  139. package/lib/ffi-bind.ts +0 -170
  140. package/lib/ffi-struct.js +0 -224
  141. package/lib/ffi-struct.ts +0 -239
  142. package/lib/win-common-structs.js +0 -39
  143. package/lib/win-common-structs.ts +0 -41
@@ -0,0 +1,469 @@
1
+ // user32.dll 精选高频 API(85 个),逐函数独立导出:
2
+ // - 签名对照 mingw winuser.h 原型手写;未被 import 的绑定经 esbuild 摇树不进产物
3
+ // - WPARAM / LPARAM / LRESULT / UINT_PTR / LONG_PTR 及句柄混合值一律 <>ptr(指针宽度跨
4
+ // 架构正确;返回值 0 保真(C→JS 不做 0→null)、有符号读对齐 C 版 JS_NewInt64——-1 哨兵等负值保真)
5
+ // - 入参字符串用 <WCHAR>ptr(string 编码为 UTF-16 + NUL,无字符串传 NULL);文本出参缓冲
6
+ // 用 <BYTE>ptr(宽字符串出参配 WCHAR.alloc(n) 当 buffer、WCHAR.decode(buf) 读回);
7
+ // 回调参数用 <>ptr 接 closure() 的 ptr
8
+ // - 结构位按方向分流(结构定义见 ./structs.ts):
9
+ // 纯入参位 <N>ptr + 注册 encoder → DeepPartial 对象直传(缺省字段 doEncode 跳过)、
10
+ // alloc().ptr、NULL 三形态;
11
+ // 出参/就地位 <N>ptr 不注册 encoder → 位只收 def 分配的 .ptr(对象 encode 进调用方拿不到
12
+ // 的临时 buffer 会丢结果;ArrayBuffer 由 unknown layout fail-fast 拦下),
13
+ // 读回走 N.decode(buf|ptr)。统一流程:encode → call → decode
14
+ // - 签名里的 <WCHAR>ptr 若语义是 MAKEINTRESOURCE 整数(如 LoadCursorW 光标名),该位用 <>ptr
15
+ // - HDC 借出/归还与消费位统一 <HDC>ptr(品牌指针 Ptr<'HDC'>):ReleaseDC 等归还位由 tsc
16
+ // 校验配对拦住误传 HWND,DrawText/FillRect 等消费位同收品牌、拦住裸 number 误传
17
+ // - 返回/入参句柄位品牌化:HWND(窗口句柄形参与返回)、HMENU(菜单组出入参)、
18
+ // HCURSOR(LoadCursor/SetCursor)一律 <N>ptr → Ptr<'N'> | NULL;gui.HWND 与
19
+ // Ptr<"HWND"> 结构同型(quickwin.d.ts 字符串键 brand),react-qw 直传零桥接。
20
+ // 异种句柄互传(如 GetDesktopWindow() → DestroyMenu)由 tsc 拦下。混合值位保持
21
+ // <>ptr:SetWindowPos 的 hWndInsertAfter(HWND_TOP 等常量)、AppendMenu.uIDNewItem
22
+ // (命令 ID 或子菜单句柄)、MAKEINTRESOURCE 光标名,以及 HBRUSH / 回调等非清单
23
+ // 句柄(HINSTANCE 即 HMODULE:走 <HMODULE>ptr 与 win 模块同型;剪贴板句柄走
24
+ // <HGLOBAL>ptr 自产自收)
25
+ import * as os from 'os';
26
+ import { bind } from '../ffi/bind.js';
27
+ // 只 import 注册了 encoder 的结构(纯入参位);POINT 等出/就地位不注册,运行时无需引用
28
+ import { RECT, SCROLLINFO } from './structs.js';
29
+ // dll 名部分应用:85 个绑定共用,签名字符串不再重复 'user32.dll'。
30
+ // 不能用 bind.bind(null, dll)——泛型在部分应用点坍缩(返回 never);工厂转调让
31
+ // S/LE/LD 在调用点正常 infer。第三参透传 encoders(结构入参位注册,见头注释方向约定)。
32
+ const b = (name, sig, encoders) => bind('user32.dll', name, sig, encoders);
33
+ // 推导保真探针:若返回类型退化(any/never 可赋给 string),本行不报错 → expect-error unused 反向暴露
34
+ // @ts-expect-error 函数返回值不能赋给 string
35
+ const _bProbe = b('GetDesktopWindow', ' -> <HWND>ptr');
36
+ void _bProbe;
37
+ // ia32 的 user32.dll 不导出 *LongPtrW(32 位下它们是 Get/SetWindowLongW 的宏,mingw
38
+ // 仅 x64 提供真实符号)——按架构选真实导出名,导出名保持统一。
39
+ const LONG_PTR_SYM = os.arch === 'x64' ? 'PtrW' : 'W';
40
+ // ============ 窗口 / 基本 ============
41
+ /** 创建窗口;失败 → NULL
42
+ * @param args_0 dwExStyle WS_EX_*
43
+ * @param args_1 lpClassName 窗口类名 string 或 NULL
44
+ * @param args_2 lpWindowName 窗口标题 string 或 NULL
45
+ * @param args_3 dwStyle WS_*(gui.WindowStyle 类常量)
46
+ * @param args_4 x 初始左上角(CW_USEDEFAULT = -1)
47
+ * @param args_5 y 初始左上角(CW_USEDEFAULT = -1)
48
+ * @param args_6 nWidth
49
+ * @param args_7 nHeight
50
+ * @param args_8 hWndParent 父窗口(可 NULL)
51
+ * @param args_9 hMenu 菜单句柄或子窗口 ID(可 NULL)
52
+ * @param args_10 hInstance 模块句柄(可 NULL)
53
+ * @param args_11 lpParam 窗口创建参数,传 NULL */
54
+ 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
+ * @param args_0 hWnd */
57
+ export const DestroyWindow = /*@__PURE__*/ b('DestroyWindow', '<HWND>ptr -> i32');
58
+ /** 显示/隐藏窗口(nCmdShow = gui.WindowStyle 类常量);返回先前可见性
59
+ * @param args_0 hWnd
60
+ * @param args_1 nCmdShow 显示命令(SW_SHOW/SW_HIDE 等) */
61
+ export const ShowWindow = /*@__PURE__*/ b('ShowWindow', '<HWND>ptr i32@ShowWindowCmd -> i32');
62
+ /** 移动/缩放窗口
63
+ * @param args_0 hWnd
64
+ * @param args_1 x 新左上角
65
+ * @param args_2 y 新左上角
66
+ * @param args_3 nWidth 新宽度
67
+ * @param args_4 nHeight 新高度
68
+ * @param args_5 bRepaint 非 0 立即重绘 */
69
+ export const MoveWindow = /*@__PURE__*/ b('MoveWindow', '<HWND>ptr i32 i32 i32 i32 i32 -> i32');
70
+ /** 设窗口位置/层级
71
+ * @param args_0 hWnd
72
+ * @param args_1 hWndInsertAfter 置前窗口或 HWND_TOP(-1)/BOTTOM(-2)/NOTOPMOST(-2) 常量
73
+ * @param args_2 x 新位置
74
+ * @param args_3 y 新位置
75
+ * @param args_4 cx 新宽度
76
+ * @param args_5 cy 新高度
77
+ * @param args_6 uFlags SWP_* 标志(SWP_NOMOVE=0x2/SWP_NOSIZE=0x1 等) */
78
+ // hwndInsertAfter 标 <>ptr@SetWindowPosHwnd:该位收 HWND_TOP 等窗口序常量(非任意窗口句柄),
79
+ // 值域是枚举而非句柄 —— 指针位 @ 标注试点。
80
+ export const SetWindowPos = /*@__PURE__*/ b('SetWindowPos', '<HWND>ptr <>ptr@SetWindowPosHwnd i32 i32 i32 i32 u32 -> i32');
81
+ /** 取窗口外框矩形(屏幕坐标)
82
+ * @param args_0 hWnd
83
+ * @param args_1 lpRect 出参槽,传 RECT.alloc().ptr、RECT.decode 读回 */
84
+ export const GetWindowRect = /*@__PURE__*/ b('GetWindowRect', '<HWND>ptr <RECT>ptr -> i32');
85
+ /** 取窗口客户区矩形
86
+ * @param args_0 hWnd
87
+ * @param args_1 lpRect 出参槽,传 RECT.alloc().ptr、RECT.decode 读回 */
88
+ export const GetClientRect = /*@__PURE__*/ b('GetClientRect', '<HWND>ptr <RECT>ptr -> i32');
89
+ /** 是否有效窗口句柄;是 → 非 0
90
+ * @param args_0 hWnd */
91
+ export const IsWindow = /*@__PURE__*/ b('IsWindow', '<HWND>ptr -> i32');
92
+ /** 窗口是否可见;是 → 非 0
93
+ * @param args_0 hWnd */
94
+ export const IsWindowVisible = /*@__PURE__*/ b('IsWindowVisible', '<HWND>ptr -> i32');
95
+ /** 窗口是否最小化;是 → 非 0
96
+ * @param args_0 hWnd */
97
+ export const IsIconic = /*@__PURE__*/ b('IsIconic', '<HWND>ptr -> i32');
98
+ /** 取前台窗口句柄;无 → NULL */
99
+ export const GetForegroundWindow = /*@__PURE__*/ b('GetForegroundWindow', ' -> <HWND>ptr');
100
+ /** 请求设前台窗口;成功 → 非 0
101
+ * @param args_0 hWnd 目标窗口 */
102
+ export const SetForegroundWindow = /*@__PURE__*/ b('SetForegroundWindow', '<HWND>ptr -> i32');
103
+ /** 取桌面窗口句柄(恒非 NULL) */
104
+ export const GetDesktopWindow = /*@__PURE__*/ b('GetDesktopWindow', ' -> <HWND>ptr');
105
+ /** 按类名+标题查找顶层窗口;无 → NULL
106
+ * @param args_0 lpClassName 窗口类名 string 或 NULL
107
+ * @param args_1 lpWindowName 窗口标题 string 或 NULL */
108
+ export const FindWindow = /*@__PURE__*/ b('FindWindowW', '<WCHAR>ptr <WCHAR>ptr -> <HWND>ptr');
109
+ /** 在 hWndParent 的子窗口链里按类名+标题查找,从 hWndChildAfter 之后开始;
110
+ * 无更多窗口 → NULL。链式遍历:FindWindowEx(NULL, prev, NULL, NULL)
111
+ * @param args_0 hWndParent 父窗口,NULL = 遍历顶层
112
+ * @param args_1 hWndChildAfter 起始子窗口,NULL = 从头
113
+ * @param args_2 lpszClass 类名 string 或 NULL = 不过滤
114
+ * @param args_3 lpszWindow 标题 string 或 NULL = 不过滤 */
115
+ export const FindWindowEx = /*@__PURE__*/ b('FindWindowExW', '<HWND>ptr <HWND>ptr <WCHAR>ptr <WCHAR>ptr -> <HWND>ptr');
116
+ /** 取窗口标题;返回写入字符数,不含 NUL
117
+ * @param args_0 hWnd
118
+ * @param args_1 lpString 出参缓冲,传 WCHAR.alloc(n)、WCHAR.decode(buf) 读回
119
+ * @param args_2 nMaxCount 缓冲容量(字符数,含 NUL 余量) */
120
+ export const GetWindowText = /*@__PURE__*/ b('GetWindowTextW', '<HWND>ptr <BYTE>ptr i32 -> i32');
121
+ /** 设窗口标题(传 string 或 NULL 清空);成功 → 非 0
122
+ * @param args_0 hWnd
123
+ * @param args_1 lpString 新标题 string 或 NULL */
124
+ export const SetWindowText = /*@__PURE__*/ b('SetWindowTextW', '<HWND>ptr <WCHAR>ptr -> i32');
125
+ /** 取窗口标题长度(字符数,不含 NUL)
126
+ * @param args_0 hWnd */
127
+ export const GetWindowTextLength = /*@__PURE__*/ b('GetWindowTextLengthW', '<HWND>ptr -> i32');
128
+ /** 取窗口类名;返回写入字符数
129
+ * @param args_0 hWnd
130
+ * @param args_1 lpClassName 出参缓冲,传 WCHAR.alloc(n)、WCHAR.decode(buf) 读回
131
+ * @param args_2 nMaxCount 缓冲容量(字符数) */
132
+ export const GetClassName = /*@__PURE__*/ b('GetClassNameW', '<HWND>ptr <BYTE>ptr i32 -> i32');
133
+ /** 取窗口附加数据;0 保真(值有符号读;ia32 走 GetWindowLongW)
134
+ * @param args_0 hWnd
135
+ * @param args_1 nIndex 索引(GWLP_WNDPROC/GWLP_USERDATA/GWL_STYLE 等) */
136
+ export const GetWindowLongPtr = /*@__PURE__*/ b('GetWindowLong' + LONG_PTR_SYM, '<HWND>ptr i32@Gwlp -> <>ptr');
137
+ /** 设窗口附加数据;返回先前值(0 保真,值有符号读)
138
+ * @param args_0 hWnd
139
+ * @param args_1 nIndex 索引(GWLP_* / GWL_*)
140
+ * @param args_2 dwNewLong 新值(整数或指针混合值) */
141
+ export const SetWindowLongPtr = /*@__PURE__*/ b('SetWindowLong' + LONG_PTR_SYM, '<HWND>ptr i32@Gwlp <>ptr -> <>ptr');
142
+ /** 取窗口所属线程 ID(第二参可传 NULL 不取进程 ID)
143
+ * @param args_0 hWnd
144
+ * @param args_1 lpdwProcessId 出参槽,传 Uint32Array(1).buffer 或 NULL */
145
+ export const GetWindowThreadProcessId = /*@__PURE__*/ b('GetWindowThreadProcessId', '<HWND>ptr <BYTE>ptr -> u32');
146
+ /** 启用/禁用窗口输入;返回先前状态
147
+ * @param args_0 hWnd
148
+ * @param args_1 bEnable 非 0 启用 */
149
+ export const EnableWindow = /*@__PURE__*/ b('EnableWindow', '<HWND>ptr i32 -> i32');
150
+ /** 取父窗口;无 → NULL
151
+ * @param args_0 hWnd */
152
+ export const GetParent = /*@__PURE__*/ b('GetParent', '<HWND>ptr -> <HWND>ptr');
153
+ /** 设父窗口;返回先前父窗口
154
+ * @param args_0 hWndChild 子窗口
155
+ * @param args_1 hWndNewParent 新父窗口 */
156
+ export const SetParent = /*@__PURE__*/ b('SetParent', '<HWND>ptr <HWND>ptr -> <HWND>ptr');
157
+ /** 按关系取相邻窗口;无 → NULL
158
+ * @param args_0 hWnd
159
+ * @param args_1 uCmd 关系(GW_CHILD=4/GW_HWNDNEXT=2/GW_OWNER=4 等 GW_*) */
160
+ export const GetWindow = /*@__PURE__*/ b('GetWindow', '<HWND>ptr u32@GetWindowCmd -> <HWND>ptr');
161
+ /** 注册窗口类;失败 → 0(ATOM)
162
+ * @param args_0 lpwcx WNDCLASSEXW.encode({ cbSize: WNDCLASSEXW.size, ... }).ptr(见 structs.ts) */
163
+ export const RegisterClassEx = /*@__PURE__*/ b('RegisterClassExW', '<BYTE>ptr -> u16');
164
+ // ============ 焦点 / 激活 ============
165
+ /** 设输入焦点;返回先前焦点窗口
166
+ * @param args_0 hWnd 接收焦点的窗口 */
167
+ export const SetFocus = /*@__PURE__*/ b('SetFocus', '<HWND>ptr -> <HWND>ptr');
168
+ /** 取调用线程输入焦点;无 → NULL */
169
+ export const GetFocus = /*@__PURE__*/ b('GetFocus', ' -> <HWND>ptr');
170
+ /** 取调用线程激活窗口;无 → NULL */
171
+ export const GetActiveWindow = /*@__PURE__*/ b('GetActiveWindow', ' -> <HWND>ptr');
172
+ /** 设调用线程激活窗口;返回先前窗口
173
+ * @param args_0 hWnd */
174
+ export const SetActiveWindow = /*@__PURE__*/ b('SetActiveWindow', '<HWND>ptr -> <HWND>ptr');
175
+ // ============ 消息循环 ============
176
+ /** 取消息(阻塞式,-1 = 出错、0 = WM_QUIT、>0 = 有消息);分发前先 TranslateMessage
177
+ * @param args_0 lpMsg MSG 出参缓冲(MSG.alloc().ptr 或自备 buffer)
178
+ * @param args_1 hWndFilter 窗口过滤,可 NULL
179
+ * @param args_2 wMsgFilterMin 消息下限,0 = 不过滤
180
+ * @param args_3 wMsgFilterMax 消息上限,0 = 不过滤 */
181
+ export const GetMessage = /*@__PURE__*/ b('GetMessageW', '<BYTE>ptr <HWND>ptr u32 u32 -> i32');
182
+ /** 非阻塞查消息;有消息 → 非 0
183
+ * @param args_0 lpMsg MSG 出参缓冲
184
+ * @param args_1 hWndFilter 窗口过滤,可 NULL
185
+ * @param args_2 wMsgFilterMin 消息下限,0 = 不过滤
186
+ * @param args_3 wMsgFilterMax 消息上限,0 = 不过滤
187
+ * @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
190
+ * @param args_0 lpMsg 取到的 MSG 缓冲(GetMessage/PeekMessage 的出参) */
191
+ export const TranslateMessage = /*@__PURE__*/ b('TranslateMessage', '<BYTE>ptr -> i32');
192
+ /** 分发 MSG 给窗口过程;返回处理结果(0 保真,有符号读)
193
+ * @param args_0 lpMsg MSG 缓冲(GetMessage/PeekMessage 的出参) */
194
+ export const DispatchMessage = /*@__PURE__*/ b('DispatchMessageW', '<BYTE>ptr -> <>ptr');
195
+ /** 异步投递消息到窗口线程队列;成功 → 非 0
196
+ * @param args_0 hWnd 目标窗口
197
+ * @param args_1 Msg 消息号(WM_*)
198
+ * @param args_2 wParam 消息参数(混合位)
199
+ * @param args_3 lParam 消息参数(混合位) */
200
+ export const PostMessage = /*@__PURE__*/ b('PostMessageW', '<HWND>ptr u32@AnyMsg <>ptr <>ptr -> i32');
201
+ /** 同步发送消息并等窗口过程处理;返回处理结果(0 保真,有符号读)
202
+ * @param args_0 hWnd 目标窗口
203
+ * @param args_1 Msg 消息号(WM_*)
204
+ * @param args_2 wParam 消息参数(整数或缓冲指针)
205
+ * @param args_3 lParam 消息参数(整数或缓冲指针) */
206
+ export const SendMessage = /*@__PURE__*/ b('SendMessageW', '<HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr');
207
+ /** 退出消息循环(投递 WM_QUIT,wParam = 退出码)
208
+ * @param args_0 nExitCode 退出码 */
209
+ export const PostQuitMessage = /*@__PURE__*/ b('PostQuitMessage', 'i32 -> void');
210
+ /** 默认窗口过程(未处理消息的兜底);返回处理结果(0 保真,有符号读)
211
+ * @param args_0 hWnd
212
+ * @param args_1 Msg 消息号
213
+ * @param args_2 wParam 消息参数
214
+ * @param args_3 lParam 消息参数 */
215
+ export const DefWindowProc = /*@__PURE__*/ b('DefWindowProcW', '<HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr');
216
+ /** 调用窗口过程(wndProc = GetWindowLongPtr(GWLP_WNDPROC) 读回的过程指针——无品牌混合位,
217
+ * 仅对本线程窗口调用);返回处理结果(0 保真,有符号读)
218
+ * @param args_0 lpPrevWndFunc 原窗口过程指针
219
+ * @param args_1 hWnd
220
+ * @param args_2 Msg 消息号
221
+ * @param args_3 wParam 消息参数
222
+ * @param args_4 lParam 消息参数 */
223
+ export const CallWindowProc = /*@__PURE__*/ b('CallWindowProcW', '<>ptr <HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr');
224
+ /** 注册系统级唯一消息 ID(按字符串比较);失败 → 0
225
+ * @param args_0 lpString 消息名 string */
226
+ export const RegisterWindowMessage = /*@__PURE__*/ b('RegisterWindowMessageW', '<WCHAR>ptr -> u32');
227
+ // ============ 绘制 / DC ============
228
+ /** 取窗口 DC(hWnd 传 NULL → 桌面窗口);失败 → NULL;用完必须 ReleaseDC 配对
229
+ * @param args_0 hWnd NULL = 桌面窗口 */
230
+ export const GetDC = /*@__PURE__*/ b('GetDC', '<HWND>ptr -> <HDC>ptr');
231
+ /** 归还 GetDC/GetWindowDC 取的 DC(首参窗口句柄、第二参 DC,误传编译不过);成功 → 非 0
232
+ * @param args_0 hWnd 取 DC 时的窗口句柄
233
+ * @param args_1 hdc 要归还的 DC */
234
+ export const ReleaseDC = /*@__PURE__*/ b('ReleaseDC', '<HWND>ptr <HDC>ptr! -> i32');
235
+ /** 让窗口把自己画进 hdcBlt(可截被遮挡 / 最小化的窗口;位图须按整窗尺寸建,从 (0,0) 填满);
236
+ * 成功 → 非 0
237
+ * @param args_0 hWnd 被截窗口
238
+ * @param args_1 hdcBlt 目标 DC
239
+ * @param args_2 nFlags PW_* 标志(PW_CLIENTONLY=1/PW_RENDERFULLCONTENT=2,Win8.1+),XP/Win7 传 0 */
240
+ export const PrintWindow = /*@__PURE__*/ b('PrintWindow', '<HWND>ptr <HDC>ptr! u32 -> i32');
241
+ /** 取整个窗口(含边框标题)DC;失败 → NULL,配对 ReleaseDC
242
+ * @param args_0 hWnd */
243
+ export const GetWindowDC = /*@__PURE__*/ b('GetWindowDC', '<HWND>ptr -> <HDC>ptr');
244
+ /** 开始重绘;返回 DC,配对 EndPaint
245
+ * @param args_0 hWnd 重绘窗口
246
+ * @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
249
+ * @param args_0 hWnd 重绘窗口
250
+ * @param args_1 lpPaint BeginPaint 同一 PAINTSTRUCT 缓冲 */
251
+ export const EndPaint = /*@__PURE__*/ b('EndPaint', '<HWND>ptr <BYTE>ptr -> i32');
252
+ /** 文本排版绘制;返回文本行高
253
+ * @param args_0 hdc 目标 DC
254
+ * @param args_1 lpchText 文本 string(自动 UTF-16 编码)
255
+ * @param args_2 cchText 字符数(-1 = 自动算到 NUL)
256
+ * @param args_3 lpRect 矩形(双向不注册 encoder;CALCRECT 就地写回:RECT.encode(初值) 传 .ptr、decode 读回)
257
+ * @param args_4 uFormat DT_* 排版标志(gui.DrawTextFlag) */
258
+ export const DrawText = /*@__PURE__*/ b('DrawTextW', '<HDC>ptr! <WCHAR>ptr i32 <RECT>ptr i32 -> i32');
259
+ /** 用画刷填充矩形;返回填充高度
260
+ * @param args_0 hdc 目标 DC
261
+ * @param args_1 lprc 矩形(DeepPartial RECT 对象或 RECT.alloc().ptr)
262
+ * @param args_2 hbr 画刷句柄(无品牌 <>ptr) */
263
+ export const FillRect = /*@__PURE__*/ b('FillRect', '<HDC>ptr! <RECT>ptr <>ptr -> i32', { RECT });
264
+ /** 标记窗口区域失效(触发重绘);成功 → 非 0
265
+ * @param args_0 hWnd
266
+ * @param args_1 lpRect 失效区域(DeepPartial RECT / .ptr / NULL = 全窗)
267
+ * @param args_2 bErase 非 0 先擦背景 */
268
+ export const InvalidateRect = /*@__PURE__*/ b('InvalidateRect', '<HWND>ptr <RECT>ptr i32 -> i32', { RECT });
269
+ /** 立即重绘失效区域;成功 → 非 0
270
+ * @param args_0 hWnd */
271
+ export const UpdateWindow = /*@__PURE__*/ b('UpdateWindow', '<HWND>ptr -> i32');
272
+ // ============ 光标 / 坐标 / 捕获 ============
273
+ /** 设光标形状(误传 HWND 编译不过);返回先前光标
274
+ * @param args_0 hCursor 光标句柄 */
275
+ export const SetCursor = /*@__PURE__*/ b('SetCursor', '<HCURSOR>ptr -> <HCURSOR>ptr');
276
+ /** 加载光标资源;失败 → NULL
277
+ * @param args_0 hInstance 模块句柄,NULL = 系统光标
278
+ * @param args_1 lpCursorName MAKEINTRESOURCE 整数(如 32512 = IDC_ARROW)直传 */
279
+ export const LoadCursor = /*@__PURE__*/ b('LoadCursorW', '<HMODULE>ptr <>ptr -> <HCURSOR>ptr');
280
+ /** 取光标屏幕坐标;成功 → 非 0
281
+ * @param args_0 lpPoint 出参槽,传 POINT.alloc().ptr、POINT.decode 读回 */
282
+ export const GetCursorPos = /*@__PURE__*/ b('GetCursorPos', '<POINT>ptr -> i32');
283
+ /** 设光标屏幕坐标;成功 → 非 0
284
+ * @param args_0 x 屏幕 x
285
+ * @param args_1 y 屏幕 y */
286
+ export const SetCursorPos = /*@__PURE__*/ b('SetCursorPos', 'i32 i32 -> i32');
287
+ /** 显示/隐藏光标(计数式);返回新计数
288
+ * @param args_0 bShow >0 显示(内部计数),<0 隐藏 */
289
+ export const ShowCursor = /*@__PURE__*/ b('ShowCursor', 'i32 -> i32');
290
+ /** 屏幕坐标 → 客户区坐标(就地更新,双向不注册 encoder);成功 → 非 0
291
+ * @param args_0 hWnd 目标窗口
292
+ * @param args_1 lpPoint 就地更新的 POINT(encode(初值) 传 .ptr、decode 读回) */
293
+ export const ScreenToClient = /*@__PURE__*/ b('ScreenToClient', '<HWND>ptr <POINT>ptr -> i32');
294
+ /** 客户区坐标 → 屏幕坐标(就地更新,同上);成功 → 非 0
295
+ * @param args_0 hWnd 源窗口
296
+ * @param args_1 lpPoint 就地更新的 POINT(同 ScreenToClient) */
297
+ export const ClientToScreen = /*@__PURE__*/ b('ClientToScreen', '<HWND>ptr <POINT>ptr -> i32');
298
+ /** 批量坐标系转换;返回偏移差的低/高 16 位打包值
299
+ * @param args_0 hWndFrom 源窗口
300
+ * @param args_1 hWndTo 目标窗口
301
+ * @param args_2 lpPoints POINT 数组缓冲
302
+ * @param args_3 cPoints 点数 */
303
+ export const MapWindowPoints = /*@__PURE__*/ b('MapWindowPoints', '<HWND>ptr <HWND>ptr <BYTE>ptr u32 -> i32');
304
+ /** 取当前捕获鼠标的窗口;无 → NULL */
305
+ export const GetCapture = /*@__PURE__*/ b('GetCapture', ' -> <HWND>ptr');
306
+ /** 捕获鼠标输入到窗口;返回先前捕获窗口
307
+ * @param args_0 hWnd 接收捕获的窗口 */
308
+ export const SetCapture = /*@__PURE__*/ b('SetCapture', '<HWND>ptr -> <HWND>ptr');
309
+ /** 释放鼠标捕获;成功 → 非 0 */
310
+ export const ReleaseCapture = /*@__PURE__*/ b('ReleaseCapture', ' -> i32');
311
+ // ============ 键盘 / 输入 ============
312
+ /** 取虚拟键状态(SHORT:高位 0x8000 = 按下、低位 = 自上次调用的切换)
313
+ * @param args_0 nVirtKey 虚拟键码(VK_*) */
314
+ export const GetKeyState = /*@__PURE__*/ b('GetKeyState', 'i32 -> i32');
315
+ /** 取虚拟键全局按下状态(高位 0x8000 = 当前按下)
316
+ * @param args_0 nVirtKey 虚拟键码(VK_*) */
317
+ export const GetAsyncKeyState = /*@__PURE__*/ b('GetAsyncKeyState', 'i32 -> i32');
318
+ /** 取全部 256 键状态;成功 → 非 0
319
+ * @param args_0 lpKeyState 出参槽,自备 256 字节 buffer */
320
+ export const GetKeyboardState = /*@__PURE__*/ b('GetKeyboardState', '<BYTE>ptr -> i32');
321
+ /** 字符 → 虚拟键+修饰键;返回 SHORT(低字节 VK、高位 shift/ctrl/alt 掩码),无 → -1
322
+ * @param args_0 ch 字符码(如 65 = 'A') */
323
+ export const VkKeyScan = /*@__PURE__*/ b('VkKeyScanW', 'u32 -> i32');
324
+ // ============ 计时器 ============
325
+ /** 设定时器(hWnd/id 传 NULL/0 = 自动分配 id,返回值读回;lpTimerFunc 传 NULL 用 WM_TIMER);失败 → 0
326
+ * @param args_0 hWnd 关联窗口,可 NULL
327
+ * @param args_1 id 定时器 ID(0 = 自动分配)
328
+ * @param args_2 uElapse 间隔毫秒
329
+ * @param args_3 lpTimerFunc 回调指针(closure().ptr),NULL = WM_TIMER 消息 */
330
+ export const SetTimer = /*@__PURE__*/ b('SetTimer', '<HWND>ptr <>ptr u32 <>ptr -> <>ptr');
331
+ /** 杀定时器(id 用 SetTimer 返回值);成功 → 非 0
332
+ * @param args_0 hWnd 关联窗口,可 NULL
333
+ * @param args_1 id 定时器 ID(SetTimer 返回值) */
334
+ export const KillTimer = /*@__PURE__*/ b('KillTimer', '<HWND>ptr <>ptr -> i32');
335
+ // ============ 剪贴板 ============
336
+ /** 打开剪贴板;成功 → 非 0,配对 CloseClipboard
337
+ * @param args_0 hWnd 拥有窗口,可 NULL */
338
+ export const OpenClipboard = /*@__PURE__*/ b('OpenClipboard', '<HWND>ptr -> i32');
339
+ /** 关闭剪贴板;成功 → 非 0 */
340
+ export const CloseClipboard = /*@__PURE__*/ b('CloseClipboard', ' -> i32');
341
+ /** 清空剪贴板(须先 OpenClipboard);成功 → 非 0 */
342
+ export const EmptyClipboard = /*@__PURE__*/ b('EmptyClipboard', ' -> i32');
343
+ /** 取剪贴板数据句柄(须先 OpenClipboard + 有数据);无 → NULL
344
+ * @param args_0 uFormat 剪贴板格式(CF_* 或 RegisterClipboardFormat 返回值) */
345
+ export const GetClipboardData = /*@__PURE__*/ b('GetClipboardData', 'u32 -> <HGLOBAL>ptr');
346
+ /** 放数据进剪贴板;成功 → 非 0
347
+ * @param args_0 uFormat 剪贴板格式
348
+ * @param args_1 hMem 全局内存句柄(所有权移交系统后勿再用) */
349
+ export const SetClipboardData = /*@__PURE__*/ b('SetClipboardData', 'u32 <HGLOBAL>ptr -> <HGLOBAL>ptr');
350
+ /** 注册自定义剪贴板格式 ID;失败 → 0
351
+ * @param args_0 lpszFormat 格式名 string */
352
+ export const RegisterClipboardFormat = /*@__PURE__*/ b('RegisterClipboardFormatW', '<WCHAR>ptr -> u32');
353
+ /** 剪贴板是否有指定格式数据;有 → 非 0
354
+ * @param args_0 format 剪贴板格式(CF_*) */
355
+ export const IsClipboardFormatAvailable = /*@__PURE__*/ b('IsClipboardFormatAvailable', 'u32 -> i32');
356
+ // ============ 菜单 ============
357
+ /** 取窗口菜单;无菜单 → NULL
358
+ * @param args_0 hWnd */
359
+ export const GetMenu = /*@__PURE__*/ b('GetMenu', '<HWND>ptr -> <HMENU>ptr');
360
+ /** 设/清窗口菜单;成功 → 非 0,改后需 DrawMenuBar
361
+ * @param args_0 hWnd
362
+ * @param args_1 hMenu 新菜单,NULL 清除 */
363
+ export const SetMenu = /*@__PURE__*/ b('SetMenu', '<HWND>ptr <HMENU>ptr -> i32');
364
+ /** 重画菜单栏;成功 → 非 0
365
+ * @param args_0 hWnd */
366
+ export const DrawMenuBar = /*@__PURE__*/ b('DrawMenuBar', '<HWND>ptr -> i32');
367
+ /** 追加菜单项;成功 → 非 0
368
+ * @param args_0 hMenu 目标菜单
369
+ * @param args_1 uFlags MF_* 标志(MF_STRING/MF_SEPARATOR/MF_POPUP 等)
370
+ * @param args_2 uIDNewItem 命令 ID 或子菜单句柄(混合位)
371
+ * @param args_3 lpNewItem 菜单项文本 string 或 NULL */
372
+ export const AppendMenu = /*@__PURE__*/ b('AppendMenuW', '<HMENU>ptr u32 <>ptr <WCHAR>ptr -> i32');
373
+ /** 销毁菜单(误传 HWND 编译不过);成功 → 非 0
374
+ * @param args_0 hMenu */
375
+ export const DestroyMenu = /*@__PURE__*/ b('DestroyMenu', '<HMENU>ptr -> i32');
376
+ /** 设菜单项勾选状态;返回先前状态(0xFFFFFFFF = 失败)
377
+ * @param args_0 hMenu
378
+ * @param args_1 uIDItem 菜单项 ID 或位置(依 uFlags MF_BYPOSITION)
379
+ * @param args_2 uCheck MF_CHECKED/MF_UNCHECKED 等 */
380
+ export const CheckMenuItem = /*@__PURE__*/ b('CheckMenuItem', '<HMENU>ptr u32 u32 -> u32');
381
+ /** 启用/禁用/灰化菜单项;返回先前状态
382
+ * @param args_0 hMenu
383
+ * @param args_1 uIDItem 菜单项 ID 或位置
384
+ * @param args_2 uEnable MF_ENABLED/MF_GRAYED/MF_DISABLED 等 */
385
+ export const EnableMenuItem = /*@__PURE__*/ b('EnableMenuItem', '<HMENU>ptr u32 u32 -> i32');
386
+ /** 取子菜单(按位置);无 → NULL(出入参同型)
387
+ * @param args_0 hMenu 父菜单
388
+ * @param args_1 nPos 子菜单位置索引 */
389
+ export const GetSubMenu = /*@__PURE__*/ b('GetSubMenu', '<HMENU>ptr i32 -> <HMENU>ptr');
390
+ /** 弹出跟踪菜单;返回菜单项命令 ID 或 0
391
+ * @param args_0 hMenu 弹出菜单
392
+ * @param args_1 uFlags TPM_* 标志
393
+ * @param args_2 x 屏幕 x
394
+ * @param args_3 y 屏幕 y
395
+ * @param args_4 nReserved 保留,传 0
396
+ * @param args_5 prcRect 点击区矩形(DeepPartial RECT / .ptr / NULL)
397
+ * @param args_6 hdc 参考 DC,可 NULL */
398
+ export const TrackPopupMenu = /*@__PURE__*/ b('TrackPopupMenu', '<HMENU>ptr u32 i32 i32 i32 <RECT>ptr <HDC>ptr -> i32', { RECT });
399
+ /** 创建弹出菜单;失败 → NULL,配对 DestroyMenu */
400
+ export const CreatePopupMenu = /*@__PURE__*/ b('CreatePopupMenu', ' -> <HMENU>ptr');
401
+ // ============ 滚动条 ============
402
+ /** 设滚动参数;返回滑块位置
403
+ * @param args_0 hWnd
404
+ * @param args_1 nBar 滚动条(SB_HORZ=0/SB_VERT=1/SB_CTL=2)
405
+ * @param args_2 lpScrollInfo DeepPartial SCROLLINFO(cbSize 必须显式给 SCROLLINFO.size——Win32
406
+ * 结构自描述要求,缺省跳过帮不了;fMask = SIF_* 决定写哪些项)
407
+ * @param args_3 redraw 非 0 立即重画 */
408
+ export const SetScrollInfo = /*@__PURE__*/ b('SetScrollInfo', '<HWND>ptr u32 <SCROLLINFO>ptr i32 -> i32', { SCROLLINFO });
409
+ /** 取滚动参数(双向不注册 encoder);成功 → 非 0
410
+ * @param args_0 hWnd
411
+ * @param args_1 nBar 滚动条(SB_*)
412
+ * @param args_2 lpScrollInfo SCROLLINFO.encode({cbSize, fMask}) 传 .ptr、decode 读回 */
413
+ export const GetScrollInfo = /*@__PURE__*/ b('GetScrollInfo', '<HWND>ptr u32 <SCROLLINFO>ptr -> i32');
414
+ /** 显示/隐藏滚动条;成功 → 非 0
415
+ * @param args_0 hWnd
416
+ * @param args_1 bar 滚动条(0=HORZ 1=VERT 3=BOTH)
417
+ * @param args_2 show 非 0 显示 */
418
+ export const ShowScrollBar = /*@__PURE__*/ b('ShowScrollBar', '<HWND>ptr u32 i32 -> i32');
419
+ // ============ 对话框 ============
420
+ /** 消息框(仅在确实要弹窗时调用;MB_* 常量见 MSDN);返回按钮 ID
421
+ * @param args_0 hWnd 父窗口,可 NULL
422
+ * @param args_1 lpText 正文 string
423
+ * @param args_2 lpCaption 标题 string
424
+ * @param args_3 uType MB_* 样式(MB_OK/MB_YESNO 等) */
425
+ export const MessageBox = /*@__PURE__*/ b('MessageBoxW', '<HWND>ptr <WCHAR>ptr <WCHAR>ptr u32 -> i32');
426
+ // ============ 图像 ============
427
+ /** 按名加载图像(string 自动编码;uType/fuLoad 用 Win32 真值——与 gui.ImageType 枚举当前值
428
+ * 不同);失败 → 0
429
+ * @param args_0 hinst 模块句柄,NULL = 系统资源或 .ico 文件
430
+ * @param args_1 name 图像名 string(资源名或文件路径)
431
+ * @param args_2 uType IMAGE_* 真值(BITMAP=0/CURSOR=1/ICON=2)
432
+ * @param args_3 cx 期望宽度(0 = 原始)
433
+ * @param args_4 cy 期望高度(0 = 原始)
434
+ * @param args_5 fuLoad LR_* 标志(LR_LOADFROMFILE=0x10/LR_SHARED=0x8000,系统 IDI 需 SHARED) */
435
+ export const LoadImage = /*@__PURE__*/ b('LoadImageW', '<HMODULE>ptr <WCHAR>ptr u32 i32 i32 u32 -> <>ptr');
436
+ /** 按资源 ID 序数加载图像(name 直传 MAKEINTRESOURCE 整数);其余同 LoadImage
437
+ * @param args_0 hinst 模块句柄
438
+ * @param args_1 name 资源 ID 序数(如 IDI_APPLICATION=32512)
439
+ * @param args_2 uType IMAGE_* 真值
440
+ * @param args_3 cx 期望宽度(0 = 原始)
441
+ * @param args_4 cy 期望高度(0 = 原始)
442
+ * @param args_5 fuLoad LR_* 标志 */
443
+ export const LoadImageOrdinal = /*@__PURE__*/ b('LoadImageW', '<HMODULE>ptr <>ptr u32 i32 i32 u32 -> <>ptr');
444
+ // ============ 杂项高频 ============
445
+ /** 取系统度量
446
+ * @param args_0 nIndex 度量索引(SM_CXSCREEN=0/SM_CYSCREEN=1 等 SM_*) */
447
+ export const GetSystemMetrics = /*@__PURE__*/ b('GetSystemMetrics', 'i32 -> i32');
448
+ /** 读/写系统参数;成功 → 非 0
449
+ * @param args_0 uiAction SPI_* 操作码
450
+ * @param args_1 uiParam 参数(随操作而定,常为缓冲大小或 0)
451
+ * @param args_2 pvParam 数据 buffer(如 SPI_GETNONCLIENTMETRICS 的缓冲)
452
+ * @param args_3 fWinIni SPIF_* 写入标志(0 = 仅当前会话) */
453
+ export const SystemParametersInfo = /*@__PURE__*/ b('SystemParametersInfoW', 'u32 u32 <BYTE>ptr u32 -> i32');
454
+ /** 枚举顶层窗口;全枚举完 → 非 0
455
+ * @param args_0 lpEnumFunc 回调指针(closure(stdcall)().ptr),回调返 0 停止
456
+ * @param args_1 lParam 透传给回调的附加值(常传 0) */
457
+ export const EnumWindows = /*@__PURE__*/ b('EnumWindows', '<>ptr <>ptr -> i32');
458
+ // ============ 显示模式(分辨率/刷新率)============
459
+ /** 枚举显示模式(iDevNum 从 0 递增直到返回 0);找到 → 非 0
460
+ * @param args_0 lpszDeviceName 设备名,NULL = 主显示设备
461
+ * @param args_1 iDevNum 模式序号(0 起递增;-1 = 当前设置)
462
+ * @param args_2 lpDevMode DEVMODEW 出参缓冲(双向不注册 encoder,只收 def 的 .ptr;
463
+ * encode({ dmSize: DEVMODEW.size }).ptr 传入、decode 读回) */
464
+ export const EnumDisplaySettings = /*@__PURE__*/ b('EnumDisplaySettingsW', '<WCHAR>ptr u32 <DEVMODEW>ptr -> i32');
465
+ /** 改显示模式;返回 DISP_CHANGE_*(0 = DISP_CHANGE_SUCCESSFUL)
466
+ * @param args_0 lpDevMode DEVMODEW 缓冲(须先枚举/预置 dmSize+dmFields,
467
+ * DM_PELSWIDTH|DM_PELSHEIGHT 等决定生效项;收 encode(...).ptr)
468
+ * @param args_1 dwFlags CDS_* 标志(0 = 仅当前会话、CDS_UPDATEREGISTRY = 写注册表持久化) */
469
+ export const ChangeDisplaySettings = /*@__PURE__*/ b('ChangeDisplaySettingsW', '<DEVMODEW>ptr u32 -> i32');