View previous topic :: View next topic |
Author |
Message |
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Wed Dec 03, 2014 00:54 Post subject: |
|
|
MVV
Спасибо, буду пробовать, как доберусь до компа. Кстати, в примерах AutoHotkey после флагов нулевой символ не ставят, в функции на AutoIt тоже, кажется, не стал.
Вообще, производит впечатление своеобразного костыля для совместимости с неюникодными Win9x/Me: откуда я могу знать, какой путь попадётся? Проверять каждый раз, что символы строки не вылезли за диапазон 0-127 не очень удобно. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Wed Dec 03, 2014 15:20 Post subject: |
|
|
Если конкатенируешь строки, обычно в конце нулевой символ добавляется автоматически. Но однозначно будет не лишним его указать явно, тем более, его необходимо учитывать в длине строки, а завершающий нулевой обычно не включается в длины строк.
А где костыль? Посылай всегда в UTF-8. Функция эта в тотале появилась давно, юникодные пути тогда еще не были в моде, потом была добавлена поддержка юникода с сохранением совместимости. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Wed Apr 22, 2015 03:42 Post subject: |
|
|
Подозреваю, что тут ответ можно получить быстрее и понятней, потому повторю свой вопрос.
Как эту конструкцию использовать внутри своих скриптов?
Например, надо нам узнать Source Path (SP) и передать его какой-то переменной.
Что-то наподобие вот этого
MyVariable := Send_WM_COPYDATA(cmd:="SP")
И ещё - если тут кто-то из AHK-шников заглянет - каким образом команда CD работает? Потому как объяснения Balderstrom весьма туманны. _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Apr 22, 2015 11:38 Post subject: |
|
|
Там уже вроде как что-то отписали, но больше невнятицы про errorlevel.
Вот этот скрипт я попробовал на 1.1.05.02, gui возвращает данные. Теперь бы ещё по-отдельности отобразить, только с иероглифами первого значения получилось... _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Wed Apr 22, 2015 14:43 Post subject: |
|
|
У меня с 1.1.21.03 ничего не показывает, активную панель скрипт показал только после изменения
Code: | inf:=Asc("G") + 256 * Asc("A")
;на
inf:=Asc("G") + 256 * Asc("W") |
С 1.1.05.02 вообще ничего. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Wed Apr 22, 2015 15:47 Post subject: |
|
|
MVV
Точно, проглядел
Quote: | I used autohotkey_L ansi version 1.1.05.01 |
Юникод рулит, однако. На AutoIt сразу делал с юникодом. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Wed Apr 22, 2015 15:48 Post subject: |
|
|
Flasher wrote: | Там уже вроде как что-то отписали, но больше невнятицы про errorlevel. |
Вроде как низзя без перехватчика OnMessage... а как его прервать после получения сообщения - вопрос.
По нажатию хоткея выполняется Send_WM_COPYDATA - формируется запрос Тоталу с заданным параметром.
Далее этот запрос обрабатывается, получается какая-то фигня - строка (иероглиф) CopyDataStruct и этот запрос отправляется Тоталу.
Тотал даёт некий ответ, и висящий в трее AHK отслеживает появление ответа через OnMessage, обрабатывает в Receive_WM_COPYDATA и высвечивает результат...
Как всё это упростить - непонятно.
Добавлено спустя 49 минут:
Ага. Индусский код начинает вырисовываться.
Убираем #Persistent чтобы скрипт не висел постоянно в памяти, убираем горячие клавиши.
Убираем MsgBox, %retVal% и в начале функции Receive_WM_COPYDATA пишем global retVal (назначаем переменную глобальной, то есть результат отправляется в глобальную переменную, которая будет доступна вне скрипта).
Тогда тело скрипта будет выглядет так
Code: | 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-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Apr 22, 2015 17:12 Post subject: |
|
|
LonerD wrote: | Тогда тело скрипта будет выглядет так | А какого скрипта не хочешь рассказать?
LonerD wrote: | Можно ли ещё проще? | Тут про функции нужно думать, там основной код.
LonerD wrote: | Можно ли и нужно ли это делать? | Думаю, нет необходимости. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Wed Apr 22, 2015 17:20 Post subject: |
|
|
Flasher wrote: | LonerD wrote: | Тогда тело скрипта будет выглядет так | А какого скрипта не хочешь рассказать? |
Я выше в теме указал - вот этот скрипт. Насколько я понимаю, он и есть финальный. Его всё время и пытаюсь "осмыслить" и адаптировать для своих потребностей. _________________ Windows 11 | TC DreamLair eternal pre-α
Last edited by LonerD on Wed Apr 22, 2015 18:29; edited 1 time in total |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Apr 22, 2015 17:30 Post subject: |
|
|
LonerD
Финальный? Это просто вариант. Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Wed Apr 22, 2015 19:41 Post subject: |
|
|
Flasher wrote: | Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует. |
Предыдущий - это вот этот имеешь в виду?
Не очень-то и компактно, если принять во внимание, что разные команды нужно отсылать - посмотри вначале скрипта конструкцию if A_IsUnicode ... else и доп. функцию StrPutVar
Flasher wrote: | А тут какие-то навороты отладочные, ну их. |
Что ты подразумеваешь под отладочными наворотами? Защиту от дурака можно просто убрать (или переделать по-своему).
Для меня туманным остаётся смысл проверки if( A_IsUnicode ). На первый взгляд все AutoHotkey.exe-шники работает и без неё.
Добавлено спустя 48 минут:
В общем, получился вот такой примерчик. Переключение панелей - определяем активную панель, и переходим на другую.
Основная суть достигнута - получено значение retVal использовано дальше в скрипте.
Code: | ; #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
} |
_________________ Windows 11 | TC DreamLair eternal pre-α
Last edited by LonerD on Thu Apr 23, 2015 15:28; edited 1 time in total |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 23, 2015 06:19 Post subject: |
|
|
LonerD wrote: | Предыдущий - это вот этот имеешь в виду? | Его.
LonerD wrote: | Не очень-то и компактно | У тебя получилось компактней? Что-то не заметил.
LonerD wrote: | Основная суть достигнута - получено значение retVal использовано дальше в скрипте. | А я как просил? Для SC, SI или SN (типа Send_WM_COPYDATA("SC") | msgbox retVal). _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Thu Apr 23, 2015 15:27 Post subject: |
|
|
Flasher wrote: | У тебя получилось компактней? |
Да, примерно на 8 строк.
Чтобы ещё сократить - в моём варианте можно убрать безболезненно "защиту от дурака"
Code: | if(!RegExMatch(cmd, "^(A|[LRST][PCIN]?)$"))
return |
Хотя сейчас посмотрел - почерпнул из того скрипта переменную A_ScriptHwnd, исправил свой скрипт.
Flasher wrote: | А я как просил? Для 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-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 23, 2015 17:18 Post subject: |
|
|
LonerD wrote: | if ( retVal = "R" ) и три строки ниже на
msgbox, % retVal | Хм. Сравнение без %, а вывод с? Как интересно. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|