Руководство по WM_COPYDATA
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
MVV
Спасибо, буду пробовать, как доберусь до компа. Кстати, в примерах AutoHotkey после флагов нулевой символ не ставят, в функции на AutoIt тоже, кажется, не стал.
Вообще, производит впечатление своеобразного костыля для совместимости с неюникодными Win9x/Me: откуда я могу знать, какой путь попадётся? Проверять каждый раз, что символы строки не вылезли за диапазон 0-127 не очень удобно.
Спасибо, буду пробовать, как доберусь до компа. Кстати, в примерах AutoHotkey после флагов нулевой символ не ставят, в функции на AutoIt тоже, кажется, не стал.
Вообще, производит впечатление своеобразного костыля для совместимости с неюникодными Win9x/Me: откуда я могу знать, какой путь попадётся? Проверять каждый раз, что символы строки не вылезли за диапазон 0-127 не очень удобно.
Если конкатенируешь строки, обычно в конце нулевой символ добавляется автоматически. Но однозначно будет не лишним его указать явно, тем более, его необходимо учитывать в длине строки, а завершающий нулевой обычно не включается в длины строк.
А где костыль? Посылай всегда в UTF-8. Функция эта в тотале появилась давно, юникодные пути тогда еще не были в моде, потом была добавлена поддержка юникода с сохранением совместимости.
А где костыль? Посылай всегда в UTF-8. Функция эта в тотале появилась давно, юникодные пути тогда еще не были в моде, потом была добавлена поддержка юникода с сохранением совместимости.
- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
Подозреваю, что тут ответ можно получить быстрее и понятней, потому повторю свой вопрос.Flasher писал(а):На англофоруме есть примеры для AHK.
Как эту конструкцию использовать внутри своих скриптов?
Например, надо нам узнать Source Path (SP) и передать его какой-то переменной.
Что-то наподобие вот этого
MyVariable := Send_WM_COPYDATA(cmd:="SP")
И ещё - если тут кто-то из AHK-шников заглянет - каким образом команда CD работает? Потому как объяснения Balderstrom весьма туманны.
Windows 11 | TC DreamLair eternal pre-α
Там уже вроде как что-то отписали, но больше невнятицы про errorlevel.
Вот этот скрипт я попробовал на 1.1.05.02, gui возвращает данные. Теперь бы ещё по-отдельности отобразить, только с иероглифами первого значения получилось...
Вот этот скрипт я попробовал на 1.1.05.02, gui возвращает данные. Теперь бы ещё по-отдельности отобразить, только с иероглифами первого значения получилось...
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
У меня с 1.1.21.03 ничего не показывает, активную панель скрипт показал только после изменения
С 1.1.05.02 вообще ничего.
Код: Выделить всё
inf:=Asc("G") + 256 * Asc("A")
;на
inf:=Asc("G") + 256 * Asc("W")- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
Вроде как низзя без перехватчика OnMessage... а как его прервать после получения сообщения - вопрос.Flasher писал(а):Там уже вроде как что-то отписали, но больше невнятицы про errorlevel.
По нажатию хоткея выполняется Send_WM_COPYDATA - формируется запрос Тоталу с заданным параметром.
Далее этот запрос обрабатывается, получается какая-то фигня - строка (иероглиф) CopyDataStruct и этот запрос отправляется Тоталу.
Тотал даёт некий ответ, и висящий в трее AHK отслеживает появление ответа через OnMessage, обрабатывает в Receive_WM_COPYDATA и высвечивает результат...
Как всё это упростить - непонятно.
Добавлено спустя 49 минут:
Ага. Индусский код начинает вырисовываться.
Убираем #Persistent чтобы скрипт не висел постоянно в памяти, убираем горячие клавиши.
Убираем MsgBox, %retVal% и в начале функции Receive_WM_COPYDATA пишем global retVal (назначаем переменную глобальной, то есть результат отправляется в глобальную переменную, которая будет доступна вне скрипта).
Тогда тело скрипта будет выглядет так
Код: Выделить всё
OnMessage(0x4a, "Receive_WM_COPYDATA")
Send_WM_COPYDATA(cmd:="A")
; в переменной retVal - желаемое значение, делаем что хотим с этим значением, и в конце концов завершаем скрипт обязательно через ExitApp
ExitAppИ зачем совет "must have a wait loop arround onMessage in order to receive data from TC"? Ведь если запустить OnMessage внутри цикла, он продолжает висеть в памяти даже после прерывания цикла...
Как прервать OnMessage? Можно ли и нужно ли это делать?
Windows 11 | TC DreamLair eternal pre-α
А какого скрипта не хочешь рассказать?LonerD писал(а):Тогда тело скрипта будет выглядет так
Тут про функции нужно думать, там основной код.LonerD писал(а):Можно ли ещё проще?
Думаю, нет необходимости.LonerD писал(а):Можно ли и нужно ли это делать?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
Я выше в теме указал - вот этот скрипт. Насколько я понимаю, он и есть финальный. Его всё время и пытаюсь "осмыслить" и адаптировать для своих потребностей.Flasher писал(а):А какого скрипта не хочешь рассказать?LonerD писал(а):Тогда тело скрипта будет выглядет так
Последний раз редактировалось LonerD Ср апр 22, 2015 17:29, всего редактировалось 1 раз.
Windows 11 | TC DreamLair eternal pre-α
LonerD
Финальный? Это просто вариант. Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует.
Финальный? Это просто вариант. Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
Предыдущий - это вот этот имеешь в виду?Flasher писал(а):Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует.
Не очень-то и компактно, если принять во внимание, что разные команды нужно отсылать - посмотри вначале скрипта конструкцию if A_IsUnicode ... else и доп. функцию StrPutVar
Что ты подразумеваешь под отладочными наворотами? Защиту от дурака можно просто убрать (или переделать по-своему).Flasher писал(а):А тут какие-то навороты отладочные, ну их.
Для меня туманным остаётся смысл проверки if( A_IsUnicode ). На первый взгляд все AutoHotkey.exe-шники работает и без неё.
Добавлено спустя 48 минут:
В общем, получился вот такой примерчик. Переключение панелей - определяем активную панель, и переходим на другую.
Основная суть достигнута - получено значение retVal использовано дальше в скрипте.
Код: Выделить всё
; #Warn
#NoEnv
#NoTrayIcon
#SingleInstance, Force
;SetBatchLInes, -1
;SendMode, Input
If WinExist("ahk_class TTOTAL_CMD") && WinActive("ahk_class TTOTAL_CMD")
{
WinGet, TCHWND, ID, A
OnMessage(0x4a, "Receive_WM_COPYDATA") ; 0x4a is WM_COPYDATA
Send_WM_COPYDATA(cmd:="A")
if ( retVal = "R" )
SendMessage, 1075, 4001,,, % "ahk_id " TCHWND
else
SendMessage, 1075, 4002,,, % "ahk_id " TCHWND
}
ExitApp
Send_WM_COPYDATA(ByRef cmd, aWinID=0x0)
{
global TCHWND
Critical
if(!RegExMatch(cmd, "^(A|[LRST][PCIN]?)$"))
return
len:=StrLen(cmd) + 1
if( A_IsUnicode ) ; This needs to be done, as TC is expecting
{ ; "chars" for the cmd string.
cmdStr:=cmd
VarSetCapacity(cmd, StrPut(cmd, "cp0"))
Loop, % len
NumPut( Asc(SubStr(cmdStr, A_Index, 1)), cmd, A_Index - 1, "Char")
}
VarSetCapacity(CopyDataStruct, A_PtrSize * 3)
NumPut(Asc("G") + 256 * Asc(A_IsUnicode ? "W" : "A"), CopyDataStruct)
NumPut(len , CopyDataStruct, A_PtrSize)
NumPut(&cmd, CopyDataStruct, A_PtrSize * 2)
SendMessage, 0x4A, %A_ScriptHwnd%, &CopyDataStruct, , % "ahk_id " TCHWND
return ErrorLevel
}
Receive_WM_COPYDATA(wParam, lParam, msg, hwnd)
{
global retVal
retVal:=StrGet(NumGet(lParam + A_PtrSize * 2))
return 1
}
Последний раз редактировалось LonerD Чт апр 23, 2015 14:28, всего редактировалось 1 раз.
Windows 11 | TC DreamLair eternal pre-α
Его.LonerD писал(а):Предыдущий - это вот этот имеешь в виду?
У тебя получилось компактней? Что-то не заметил.LonerD писал(а):Не очень-то и компактно
А я как просил? Для SC, SI или SN (типа Send_WM_COPYDATA("SC") | msgbox retVal).LonerD писал(а):Основная суть достигнута - получено значение retVal использовано дальше в скрипте.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
Да, примерно на 8 строк.Flasher писал(а):У тебя получилось компактней?
Чтобы ещё сократить - в моём варианте можно убрать безболезненно "защиту от дурака"
Код: Выделить всё
if(!RegExMatch(cmd, "^(A|[LRST][PCIN]?)$"))
returnЗаменитьFlasher писал(а):А я как просил? Для SC, SI или SN (типа Send_WM_COPYDATA("SC") | msgbox retVal).
Send_WM_COPYDATA(cmd:="A")
на желаемое, например
Send_WM_COPYDATA(cmd:="SC").
Входные данные - ByRef, потому не ("SC"), а (cmd:="SC")
Также заменить
if ( retVal = "R" ) и три строки ниже на
msgbox, % retVal
Windows 11 | TC DreamLair eternal pre-α
Хм. Сравнение без %, а вывод с? Как интересно.LonerD писал(а):if ( retVal = "R" ) и три строки ниже на
msgbox, % retVal
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.