Тема: AHK: Отправка сообщений в чат
Написал скрипт для отправки в чат сообщений для игры. Если кто разбирается, то есть несколько вопросов:
ConsoleCommand := "say привет"
F1::
VarSetCapacity(UTF-8, size := StrPut(ConsoleCommand, "UTF-8") * 2, 0)
StrPut(ConsoleCommand, &UTF-8, "UTF-8")
VarSetCapacity(COPYDATASTRUCT, A_PtrSize * 3, 0)
;NumPut(0, COPYDATASTRUCT, 0, "Uint")
NumPut(520, COPYDATASTRUCT, 4, "Uint")
NumPut(&UTF-8, COPYDATASTRUCT, 8, "UPtr")
SendMessage, 0x004A,, ©DATASTRUCT,, ahk_exe csgo.exe
return
1) Почему первое поле структуры CopyDataStruct нужно указывать в 0? По идее должно быть 1, т.к. передается текст.
2) Зачем в VarSetCapacity заносить StrPut? Только потому, что так точнее отображается длинна строки?.
3) Как посчитать, сколько байт содержит строка в анси или юникод кодировке, т.к. ее размер в байтах нужно передать.
Ну и вообще, правильно ли составлен скрипт? Т.к. нужно правильно передать русский текст? Спасибо.
Исправленный вариант:
DetectHiddenWindows, On
Setbatchlines -1
ConsoleCommand := "say привет"
F1::
WinGet, hWnd, ID, ahk_class Valve001
VarSetCapacity(message, SizeInBytes := StrPut(ConsoleCommand, "UTF-8") * (A_IsUnicode ? 2 : 1), 0)
StrPut(ConsoleCommand, &message, "UTF-8")
VarSetCapacity(COPYDATASTRUCT, A_PtrSize*3, 0)
;NumPut(0, COPYDATASTRUCT, 0, "Uint")
NumPut(SizeInBytes, COPYDATASTRUCT, A_PtrSize, "UInt")
NumPut(&message, COPYDATASTRUCT, A_PtrSize*2, "Ptr")
DllCall("SendMessage", "Ptr", hWnd, UInt, WM_COPYDATA := 0x4A, "Ptr", 0, "Ptr", ©DATASTRUCT)
return