quickwin 2.1.1 → 2.3.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 (117) hide show
  1. package/README.en.md +9 -9
  2. package/README.md +9 -9
  3. package/constants.ts +1063 -0
  4. package/enum_map.d.ts +129 -0
  5. package/examples/PdfCanvas.js +2 -2
  6. package/examples/PdfCanvas.tsx +3 -2
  7. package/examples/{exec_server.js → execd/main.js} +1114 -287
  8. package/examples/execd/tray.js +192 -0
  9. package/examples/execd/worker.js +122 -0
  10. package/examples/pdf_preview2.js +46 -46
  11. package/examples/pdf_preview2.ts +55 -54
  12. package/examples/pdf_viewer.js +134 -130
  13. package/examples/pdf_viewer.tsx +6 -5
  14. package/examples/test_gallery.js +135 -131
  15. package/examples/test_gallery.tsx +9 -8
  16. package/examples/test_react_lazy.js +130 -128
  17. package/examples/test_react_lazy.tsx +7 -6
  18. package/examples/test_react_listbox.js +130 -128
  19. package/examples/test_react_listbox.tsx +8 -7
  20. package/examples/test_root_window.js +130 -128
  21. package/examples/test_root_window.tsx +5 -5
  22. package/examples/test_tab.js +130 -128
  23. package/examples/test_tab.tsx +7 -6
  24. package/examples/tray_demo.js +8 -8
  25. package/examples/tray_demo.tsx +9 -8
  26. package/lib/dumpRects.js +2 -2
  27. package/lib/dumpRects.ts +3 -2
  28. package/lib/fetch.js +15 -15
  29. package/lib/fetch.ts +16 -15
  30. package/lib/ffi/bind.js +3 -3
  31. package/lib/ffi/bind.ts +3 -3
  32. package/lib/ffi/ctype.ts +3 -1
  33. package/lib/ffi/struct.js +23 -7
  34. package/lib/ffi/struct.ts +50 -23
  35. package/lib/http-server.js +5 -5
  36. package/lib/http-server.ts +6 -5
  37. package/lib/react-qw/components/Button.js +2 -2
  38. package/lib/react-qw/components/CheckBox.js +4 -4
  39. package/lib/react-qw/components/ComboBox.js +10 -10
  40. package/lib/react-qw/components/DateTimePicker.js +12 -12
  41. package/lib/react-qw/components/Input.js +7 -7
  42. package/lib/react-qw/components/Link.js +4 -4
  43. package/lib/react-qw/components/ListBox.js +12 -12
  44. package/lib/react-qw/components/ListView.js +35 -35
  45. package/lib/react-qw/components/PathPicker.js +3 -3
  46. package/lib/react-qw/components/ProgressBar.js +4 -4
  47. package/lib/react-qw/components/RadioButton.js +4 -4
  48. package/lib/react-qw/components/ScrollView.js +28 -28
  49. package/lib/react-qw/components/Slider.js +11 -11
  50. package/lib/react-qw/components/Tab.js +10 -10
  51. package/lib/react-qw/components/Tooltip.js +8 -8
  52. package/lib/react-qw/components/TreeView.js +20 -20
  53. package/lib/react-qw/index.js +5 -5
  54. package/lib/react-qw/index.ts +6 -5
  55. package/lib/react-qw/props.js +4 -4
  56. package/lib/react-qw/props.ts +5 -4
  57. package/lib/react-qw/reconciler.js +10 -10
  58. package/lib/react-qw/reconciler.ts +11 -10
  59. package/lib/text-measure.js +3 -3
  60. package/lib/text-measure.ts +4 -3
  61. package/lib/websocket.js +17 -17
  62. package/lib/websocket.ts +18 -17
  63. package/lib/windows/advapi32.js +7 -7
  64. package/lib/windows/advapi32.ts +7 -7
  65. package/lib/windows/gdi32.js +17 -17
  66. package/lib/windows/gdi32.ts +17 -17
  67. package/lib/windows/kernel32.js +41 -2
  68. package/lib/windows/kernel32.ts +45 -2
  69. package/lib/windows/shell32.js +24 -3
  70. package/lib/windows/shell32.ts +27 -4
  71. package/lib/windows/structs.js +230 -92
  72. package/lib/windows/structs.ts +278 -92
  73. package/lib/windows/user32.js +18 -6
  74. package/lib/windows/user32.ts +18 -6
  75. package/lib/windows/winspool.js +3 -3
  76. package/lib/windows/winspool.ts +3 -3
  77. package/package.json +4 -3
  78. package/quickwin.d.ts +32 -10
  79. package/qwin-nowasm-x86.exe +0 -0
  80. package/qwin-nowasm.exe +0 -0
  81. package/qwin-x86.exe +0 -0
  82. package/qwin.exe +0 -0
  83. package/test/test_ffi_bind.js +12 -10
  84. package/test/test_ffi_bind.ts +14 -12
  85. package/test/test_ffi_struct.js +60 -26
  86. package/test/test_ffi_struct.ts +58 -28
  87. package/test/test_ffi_windows.js +1 -1
  88. package/test/test_ffi_windows.ts +1 -1
  89. package/test/test_files.js +7 -7
  90. package/test/test_files.ts +8 -8
  91. package/test/test_gdi_draw.js +51 -51
  92. package/test/test_gdi_draw.ts +57 -57
  93. package/test/test_http_server.js +3 -3
  94. package/test/test_http_server.ts +4 -3
  95. package/test/test_ipv6.js +3 -3
  96. package/test/test_ipv6.ts +4 -3
  97. package/test/test_net_event.js +3 -3
  98. package/test/test_net_event.ts +4 -3
  99. package/test/test_printer.js +4 -4
  100. package/test/test_printer.ts +5 -5
  101. package/test/test_react_complex.js +132 -130
  102. package/test/test_react_counter.js +130 -128
  103. package/test/test_react_flex.js +132 -130
  104. package/test/test_react_hidden.js +130 -128
  105. package/test/test_react_listview_link.js +131 -129
  106. package/test/test_react_notify.js +148 -146
  107. package/test/test_react_render.js +130 -128
  108. package/test/test_registry.js +6 -6
  109. package/test/test_registry.ts +8 -8
  110. package/test/test_wolfssl_read.js +8 -8
  111. package/test/test_wolfssl_read.ts +9 -8
  112. package/examples/exec_server.tsx +0 -488
  113. package/examples/exec_server_worker.js +0 -395
  114. package/examples/exec_server_worker.ts +0 -417
  115. package/examples/setres.js +0 -79
  116. package/examples/setres.ts +0 -86
  117. package/quickwin_const.d.ts +0 -1037
@@ -9,6 +9,7 @@ import { BITMAPINFOHEADER, OPENFILENAMEW } from '../lib/windows/structs.js'
9
9
  import { GetOpenFileName } from '../lib/windows/comdlg32.js'
10
10
  import { GetDC, ReleaseDC } from '../lib/windows/user32.js'
11
11
  import { PatBlt, SetDIBitsToDevice } from '../lib/windows/gdi32.js'
12
+ import { Gwlp, MouseKeyFlag, ScrollBar, ScrollCmd, SetWindowPosFlag, SetWindowPosHwnd, WindowStyle, WmMsg } from '../constants'
12
13
 
13
14
  type MuPdf = typeof import('../vendor/mupdf-wasm/mupdf.js')
14
15
 
@@ -120,32 +121,32 @@ function updateScrollRange(): void {
120
121
  scrollX = Math.min(scrollX, maxX)
121
122
  scrollY = Math.min(scrollY, maxY)
122
123
  if (currentPixmap.w > cw) {
123
- const style = gui.GetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE) | 0
124
- if (!(style & gui.WindowStyle.HSCROLL)) {
125
- gui.SetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE, style | gui.WindowStyle.HSCROLL)
126
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 0, 0, 0,
127
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOSIZE |
128
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_FRAMECHANGED)
124
+ const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
125
+ if (!(style & WindowStyle.HSCROLL)) {
126
+ gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style | WindowStyle.HSCROLL)
127
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
128
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
129
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
129
130
  }
130
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.HORZ, { min: 0, max: currentPixmap.w - 1, page: cw, pos: scrollX }, true)
131
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.HORZ, true)
131
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { min: 0, max: currentPixmap.w - 1, page: cw, pos: scrollX }, true)
132
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, true)
132
133
  } else {
133
134
  scrollX = 0
134
- const style = gui.GetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE) | 0
135
- if (style & gui.WindowStyle.HSCROLL) {
136
- gui.SetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE, style & ~gui.WindowStyle.HSCROLL)
137
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 0, 0, 0,
138
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOSIZE |
139
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_FRAMECHANGED)
135
+ const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
136
+ if (style & WindowStyle.HSCROLL) {
137
+ gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style & ~WindowStyle.HSCROLL)
138
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
139
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
140
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
140
141
  }
141
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.HORZ, false)
142
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, false)
142
143
  }
143
144
  if (currentPixmap.h > ch) {
144
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.VERT, { min: 0, max: currentPixmap.h - 1, page: ch, pos: scrollY }, true)
145
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.VERT, true)
146
- } else { scrollY = 0; gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.VERT, false) }
147
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
148
- gui.SetWindowPosFlag.SWP_NOSIZE | gui.SetWindowPosFlag.SWP_NOZORDER)
145
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { min: 0, max: currentPixmap.h - 1, page: ch, pos: scrollY }, true)
146
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, true)
147
+ } else { scrollY = 0; gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, false) }
148
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
149
+ SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
149
150
  }
150
151
 
151
152
  function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
@@ -155,8 +156,8 @@ function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
155
156
  currentPixmap = pix; currentPage = pageIdx; totalPages = pix.totalPages
156
157
  gui.SetWindowText(hwndMain, 'PDF 预览 - 第 ' + (pageIdx + 1) + '/' + totalPages + ' 页')
157
158
  scrollX = 0; scrollY = 0
158
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, 0, 0, pix.w, pix.h,
159
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_NOMOVE)
159
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, 0, 0, pix.w, pix.h,
160
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_NOMOVE)
160
161
  updateScrollRange()
161
162
  gui.InvalidateRect(hwndContent, null, true)
162
163
  }
@@ -170,19 +171,19 @@ function doScroll(dx: number, dy: number): void {
170
171
  const maxY = Math.max(0, currentPixmap.h - ch)
171
172
  scrollX = Math.max(0, Math.min(maxX, scrollX + dx))
172
173
  scrollY = Math.max(0, Math.min(maxY, scrollY + dy))
173
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
174
- gui.SetWindowPosFlag.SWP_NOSIZE | gui.SetWindowPosFlag.SWP_NOZORDER)
175
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.HORZ, { pos: scrollX }, true)
176
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.VERT, { pos: scrollY }, true)
174
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
175
+ SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
176
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { pos: scrollX }, true)
177
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { pos: scrollY }, true)
177
178
  }
178
179
 
179
180
  async function main(): Promise<void> {
180
181
  const mupdf = await loadMupdf()
181
182
  if (!mupdf) { gui.MessageBox('加载 mupdf WASM 失败'); return }
182
183
 
183
- const WS_CHILD = gui.WindowStyle.CHILD
184
- const WS_VIS = gui.WindowStyle.VISIBLE
185
- const WS_BORDER = gui.WindowStyle.BORDER
184
+ const WS_CHILD = WindowStyle.CHILD
185
+ const WS_VIS = WindowStyle.VISIBLE
186
+ const WS_BORDER = WindowStyle.BORDER
186
187
  const ctrlY = 12, ctrlH = 26, gap = 4, btnW = 80, btnPageW = 72
187
188
 
188
189
  let hwndBtnOpen: gui.HWND | null = null
@@ -191,18 +192,18 @@ let hwndBtnNext: gui.HWND | null = null
191
192
 
192
193
  gui.RegisterClass('PdfViewer2', (hwnd, msg, wParam, lParam) => {
193
194
  assertNonNullable(hwndCanvas); assertNonNullable(hwndEdit); assertNonNullable(hwndBtnOpen); assertNonNullable(hwndBtnPrev); assertNonNullable(hwndBtnNext)
194
- if (msg === gui.WmMsg.DESTROY) { gui.PostQuitMessage(0); return 0 }
195
- if (msg === gui.WmMsg.SIZE) {
195
+ if (msg === WmMsg.DESTROY) { gui.PostQuitMessage(0); return 0 }
196
+ if (msg === WmMsg.SIZE) {
196
197
  const cr = gui.GetClientRect(hwnd)
197
198
  if (cr) {
198
199
  const cw = cr.right - cr.left, ch = cr.bottom - cr.top
199
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 50, cw, Math.max(1, ch - 50), gui.SetWindowPosFlag.SWP_NOZORDER)
200
- gui.SetWindowPos(hwndEdit, gui.SetWindowPosHwnd.TOP, 0, 0, Math.max(100, cw - 320), 0,
201
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOZORDER)
200
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 50, cw, Math.max(1, ch - 50), SetWindowPosFlag.SWP_NOZORDER)
201
+ gui.SetWindowPos(hwndEdit, SetWindowPosHwnd.TOP, 0, 0, Math.max(100, cw - 320), 0,
202
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOZORDER)
202
203
  }
203
204
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
204
205
  }
205
- if (msg === gui.WmMsg.COMMAND) {
206
+ if (msg === WmMsg.COMMAND) {
206
207
  const hCtrl = lParam
207
208
  if (hCtrl === hwndBtnOpen) {
208
209
  const path = openPdfFileDialog()
@@ -219,7 +220,7 @@ let hwndBtnNext: gui.HWND | null = null
219
220
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
220
221
  })
221
222
  hwndMain = gui.CreateWindow('PdfViewer2', 'PDF 预览 2',
222
- gui.WindowStyle.OVERLAPPEDWINDOW | gui.WindowStyle.CLIPCHILDREN,
223
+ WindowStyle.OVERLAPPEDWINDOW | WindowStyle.CLIPCHILDREN,
223
224
  100, 100, 1100, 800, null, null)!
224
225
  if (!hwndMain) { gui.MessageBox('创建主窗口失败'); return }
225
226
 
@@ -239,7 +240,7 @@ let hwndBtnNext: gui.HWND | null = null
239
240
 
240
241
  // 画布(带滚动条)
241
242
  hwndCanvas = gui.CreateWindow('STATIC', '',
242
- WS_CHILD | WS_VIS | gui.WindowStyle.CLIPCHILDREN | gui.WindowStyle.VSCROLL | gui.WindowStyle.HSCROLL,
243
+ WS_CHILD | WS_VIS | WindowStyle.CLIPCHILDREN | WindowStyle.VSCROLL | WindowStyle.HSCROLL,
243
244
  0, 50, 1100, 750, hwndMain, null)!
244
245
 
245
246
  // 内容窗口(画 pixmap)
@@ -256,8 +257,8 @@ let hwndBtnNext: gui.HWND | null = null
256
257
 
257
258
  // 内容窗口 PAINT
258
259
  gui.SetWindowProc(hwndContent, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
259
- if (msg === gui.WmMsg.ERASEBKGND) return 1
260
- if (msg === gui.WmMsg.PAINT) {
260
+ if (msg === WmMsg.ERASEBKGND) return 1
261
+ if (msg === WmMsg.PAINT) {
261
262
  gui.DefWindowProc(hwnd, msg, wParam, lParam)
262
263
  const pm = currentPixmap
263
264
  if (!pm) return 0
@@ -274,8 +275,8 @@ let hwndBtnNext: gui.HWND | null = null
274
275
 
275
276
  // 画布消息处理(PAINT 填白、滚动条、滚轮)
276
277
  gui.SetWindowProc(hwndCanvas, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
277
- if (msg === gui.WmMsg.ERASEBKGND) return 1
278
- if (msg === gui.WmMsg.PAINT) {
278
+ if (msg === WmMsg.ERASEBKGND) return 1
279
+ if (msg === WmMsg.PAINT) {
279
280
  const cr = gui.GetClientRect(hwnd)
280
281
  if (cr) {
281
282
  const cw = cr.right - cr.left, ch = cr.bottom - cr.top
@@ -288,29 +289,29 @@ let hwndBtnNext: gui.HWND | null = null
288
289
  gui.DefWindowProc(hwnd, msg, wParam, lParam)
289
290
  return 0
290
291
  }
291
- if (msg === gui.WmMsg.VSCROLL || msg === gui.WmMsg.HSCROLL) {
292
- const bar = msg === gui.WmMsg.VSCROLL ? gui.ScrollBar.VERT : gui.ScrollBar.HORZ
292
+ if (msg === WmMsg.VSCROLL || msg === WmMsg.HSCROLL) {
293
+ const bar = msg === WmMsg.VSCROLL ? ScrollBar.VERT : ScrollBar.HORZ
293
294
  const info = gui.GetScrollInfo(hwnd, bar)
294
295
  const maxPos = info.max - info.page + 1
295
296
  const code = wParam & 0xFFFF
296
- let newPos = bar === gui.ScrollBar.VERT ? scrollY : scrollX
297
- if (code === gui.ScrollCmd.THUMBTRACK || code === gui.ScrollCmd.THUMBPOSITION)
297
+ let newPos = bar === ScrollBar.VERT ? scrollY : scrollX
298
+ if (code === ScrollCmd.THUMBTRACK || code === ScrollCmd.THUMBPOSITION)
298
299
  newPos = Math.max(0, Math.min(maxPos, (wParam >> 16) & 0xFFFF))
299
- else if (code === gui.ScrollCmd.LINEUP) newPos -= 20
300
- else if (code === gui.ScrollCmd.LINEDOWN) newPos += 20
301
- else if (code === gui.ScrollCmd.PAGEUP) newPos -= info.page
302
- else if (code === gui.ScrollCmd.PAGEDOWN) newPos += info.page
300
+ else if (code === ScrollCmd.LINEUP) newPos -= 20
301
+ else if (code === ScrollCmd.LINEDOWN) newPos += 20
302
+ else if (code === ScrollCmd.PAGEUP) newPos -= info.page
303
+ else if (code === ScrollCmd.PAGEDOWN) newPos += info.page
303
304
  else return 0
304
305
  newPos = Math.max(0, Math.min(maxPos, newPos))
305
- if (bar === gui.ScrollBar.VERT) doScroll(0, newPos - scrollY)
306
+ if (bar === ScrollBar.VERT) doScroll(0, newPos - scrollY)
306
307
  else doScroll(newPos - scrollX, 0)
307
308
  return 0
308
309
  }
309
- if (msg === gui.WmMsg.MOUSEWHEEL) {
310
+ if (msg === WmMsg.MOUSEWHEEL) {
310
311
  const raw = (wParam >>> 16) & 0xFFFF
311
312
  const wheel = raw >= 0x8000 ? raw - 0x10000 : raw
312
- const isHorz = (wParam & gui.MouseKeyFlag.MK_SHIFT) !== 0
313
- const bar = isHorz ? gui.ScrollBar.HORZ : gui.ScrollBar.VERT
313
+ const isHorz = (wParam & MouseKeyFlag.MK_SHIFT) !== 0
314
+ const bar = isHorz ? ScrollBar.HORZ : ScrollBar.VERT
314
315
  const info = gui.GetScrollInfo(hwnd, bar)
315
316
  const maxPos = info.max - info.page + 1
316
317
  let newPos = (isHorz ? scrollX : scrollY) - Math.round(wheel * 40 / 120)
@@ -319,7 +320,7 @@ let hwndBtnNext: gui.HWND | null = null
319
320
  else doScroll(0, newPos - scrollY)
320
321
  return 0
321
322
  }
322
- if (msg === gui.WmMsg.SIZE) { updateScrollRange(); return gui.DefWindowProc(hwnd, msg, wParam, lParam) }
323
+ if (msg === WmMsg.SIZE) { updateScrollRange(); return gui.DefWindowProc(hwnd, msg, wParam, lParam) }
323
324
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
324
325
  })
325
326