Orion9

|
Posted: Tue Feb 25, 2025 13:17 Post subject: |
|
|
Loopback wrote: | К сожалению, в структурах есть такая неприятная вещь, как... |
Для неискушённого пользователя "сюрпризов" там хватает ) Например, не понятно, нужно ли самому считать размер структуры или где-то есть уже готовые таблицы, типа:
 Hidden text Code: | ; typedef struct tagCHOOSECOLORW { offset size (x86/x64)
; DWORD lStructSize; |0 | 4
; HWND hwndOwner; |4 / 8 | 8 /16
; HWND hInstance; |8 /16 | 12/24
; COLORREF rgbResult; |12/24 | 16/28
; COLORREF *lpCustColors; |16/28 | 20/32
; DWORD Flags; |20/32 | 24/36
; LPARAM lCustData; |24/40 | 28/48 <-- padding for x64
; LPCCHOOKPROC lpfnHook; |28/48 | 32/56
; LPCWSTR lpTemplateName; |32/56 | 36/64
; LPEDITMENU lpEditInfo; |36/64 | 40/72
; } CHOOSECOLORW, *LPCHOOSECOLORW; |
Фрагмент из скрипта AutoHotkey для вызова системного диалога "Выбор цвета". Видимо, автор всё-таки сам делал этот расчёт, поскольку выравнивание (paddiing), если я правильно понимаю, указано неверно
Попробовал сделать на Autorun этот вызов:
 Hidden text Code: | # системный диалог выбора цвета
RegisterCommand 70052 "ColorSelect"
Func ColorSelect(lParam)
Local cls = Buffer(64), buf = Buffer(auX64 ? 72 : 36)
cls.Zero()
cls.SetNum(0, "dword", 0x000000FF, _
"dword", 0x0000FF00, _
"dword", 0x00FF0000, _
"dword", 0x00808080)
buf.Zero()
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "hwnd", 0, _
"uint", 0)
buf.SetNum(32, "ptr", cls.ptr, _
"dword", 0x00000002)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"hwnd", 0, _
"uint", 0, _
"ptr", cls.ptr, _
"dword", 0x00000002)
EndIf
DllCall("comdlg32.dll\ChooseColorW", "ptr", buf.ptr, "bool")
Free(buf, cls)
EndFunc |
Вроде всё работает ) Правда, в функции нет обработки результата выбора цвета, но он мне не нужен, так как окно диалога вызывается для других целей. |
|