1 (изменено: svoboden, 2022-02-06 22:19:50)

Тема: 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,, &COPYDATASTRUCT,, 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", &COPYDATASTRUCT)
return

2

Re: AHK: Отправка сообщений в чат

svoboden пишет:

правильно ли составлен скрипт?

Прежде всего, не стоило бы называть переменную UTF-8. Это надо же было додуматься!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: svoboden, 2022-02-05 12:55:22)

Re: AHK: Отправка сообщений в чат

Это указатель вроде , переменную я бы так не называл. А так да, согласен. Чтобы не запутаться в коде написал.

4

Re: AHK: Отправка сообщений в чат

Это именно переменная.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: svoboden, 2022-02-05 18:02:26)

Re: AHK: Отправка сообщений в чат

Хорошо, спасибо. Т.е. кроме названия переменных, ошибок больше нету?

6

Re: AHK: Отправка сообщений в чат

Да там, кроме ошибок, ничего и нету. И вообще мало что понятно. Что там за 520, откуда оно взялось? Почему не 666? Судя по строке

VarSetCapacity(COPYDATASTRUCT, A_PtrSize * 3, 0)

предполагается учитывать размер указателя, но в следующих строках он не учитывается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: svoboden, 2022-02-05 20:39:25)

Re: AHK: Отправка сообщений в чат

Насколько я понял, вместо 520 должна быть длина строки в байтах, а не в символов, но как узнать длину строки в байтах. Т.е. нужно так писать?

size := StrPut(ConsoleCommand, "UTF-16")*2

NumPut(size, COPYDATASTRUCT, A_PtrSize, "Uint")
NumPut(&ConsoleCommand, COPYDATASTRUCT, A_PtrSize*2)

Но у меня UTF-16 не посылает русский текст, только UTF-8 посылает.

8

Re: AHK: Отправка сообщений в чат

Посылать нужно в той кодировке, которую ожидает принимающая функция.

svoboden пишет:

Т.е. нужно так писать?

Если отправляете из Юникод-версии, и хотите отправить в кодировке UTF-16, то так. Если вресия ANSI, тогда нужно преобразовать строку в Юникод.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Отправка сообщений в чат

Хорошо, спасибо. А не подскажите, зачем в:

VarSetCapacity(UTF-8, size := StrPut(ConsoleCommand, "UTF-8") * 2, 0)

нужно отправлять строку?

10

Re: AHK: Отправка сообщений в чат

Я не понял вопроса. Какую переменную имеете в виду?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: svoboden, 2022-02-06 00:26:58)

Re: AHK: Отправка сообщений в чат

Не переменную, а строку, непонятен синтаксис:

VarSetCapacity(UTF-8, size := StrPut(ConsoleCommand, "UTF-8") * 2, 0)

12 (изменено: svoboden, 2022-02-06 02:00:25)

Re: AHK: Отправка сообщений в чат

Попробую сам разобраться.