Руководство по WM_COPYDATA
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, 4  Next  :| |:
Total Commander -> Автоматизация Total Commander

#16:  Author: Skif_off PostPosted: Wed Dec 03, 2014 00:54
    —
MVV
Спасибо, буду пробовать, как доберусь до компа. Кстати, в примерах AutoHotkey после флагов нулевой символ не ставят, в функции на AutoIt тоже, кажется, не стал.
Вообще, производит впечатление своеобразного костыля для совместимости с неюникодными Win9x/Me: откуда я могу знать, какой путь попадётся? Проверять каждый раз, что символы строки не вылезли за диапазон 0-127 не очень удобно.

#17:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Dec 03, 2014 15:20
    —
Если конкатенируешь строки, обычно в конце нулевой символ добавляется автоматически. Но однозначно будет не лишним его указать явно, тем более, его необходимо учитывать в длине строки, а завершающий нулевой обычно не включается в длины строк.
А где костыль? Посылай всегда в UTF-8. Функция эта в тотале появилась давно, юникодные пути тогда еще не были в моде, потом была добавлена поддержка юникода с сохранением совместимости.

#18:  Author: LonerDLocation: Донецк PostPosted: Wed Apr 22, 2015 03:42
    —
Flasher wrote:
На англофоруме есть примеры для AHK.

Подозреваю, что тут ответ можно получить быстрее и понятней, потому повторю свой вопрос.
Как эту конструкцию использовать внутри своих скриптов?
Например, надо нам узнать Source Path (SP) и передать его какой-то переменной.
Что-то наподобие вот этого
MyVariable := Send_WM_COPYDATA(cmd:="SP")

И ещё - если тут кто-то из AHK-шников заглянет - каким образом команда CD работает? Потому как объяснения Balderstrom весьма туманны.

#19:  Author: FlasherLocation: Москва PostPosted: Wed Apr 22, 2015 11:38
    —
Там уже вроде как что-то отписали, но больше невнятицы про errorlevel.
Вот этот скрипт я попробовал на 1.1.05.02, gui возвращает данные. Теперь бы ещё по-отдельности отобразить, только с иероглифами первого значения получилось...

#20:  Author: Skif_off PostPosted: Wed Apr 22, 2015 14:43
    —
У меня с 1.1.21.03 ничего не показывает, активную панель скрипт показал только после изменения
Code:
inf:=Asc("G") + 256 * Asc("A")
;на
inf:=Asc("G") + 256 * Asc("W")

С 1.1.05.02 вообще ничего.

#21:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Apr 22, 2015 14:45
    —
Skif_off,
Видимо, твоя версия AHK юникодная, поэтому и идентификатор сообщения нужно указывать юникодный.

#22:  Author: Skif_off PostPosted: Wed Apr 22, 2015 15:47
    —
MVV
Точно, проглядел
Quote:
I used autohotkey_L ansi version 1.1.05.01

Юникод рулит, однако. На AutoIt сразу делал с юникодом.

#23:  Author: LonerDLocation: Донецк PostPosted: Wed Apr 22, 2015 15:48
    —
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? Можно ли и нужно ли это делать?

#24:  Author: FlasherLocation: Москва PostPosted: Wed Apr 22, 2015 17:12
    —
LonerD wrote:
Тогда тело скрипта будет выглядет так
А какого скрипта не хочешь рассказать? Smile
LonerD wrote:
Можно ли ещё проще?
Тут про функции нужно думать, там основной код.
LonerD wrote:
Можно ли и нужно ли это делать?
Думаю, нет необходимости.

#25:  Author: LonerDLocation: Донецк PostPosted: Wed Apr 22, 2015 17:20
    —
Flasher wrote:
LonerD wrote:
Тогда тело скрипта будет выглядет так
А какого скрипта не хочешь рассказать? Smile

Я выше в теме указал - вот этот скрипт. Насколько я понимаю, он и есть финальный. Его всё время и пытаюсь "осмыслить" и адаптировать для своих потребностей.


Last edited by LonerD on Wed Apr 22, 2015 18:29; edited 1 time in total

#26:  Author: FlasherLocation: Москва PostPosted: Wed Apr 22, 2015 17:30
    —
LonerD
Финальный? Это просто вариант. Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует.

#27:  Author: LonerDLocation: Донецк PostPosted: Wed Apr 22, 2015 19:41
    —
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
}


Last edited by LonerD on Thu Apr 23, 2015 15:28; edited 1 time in total

#28:  Author: FlasherLocation: Москва PostPosted: Thu Apr 23, 2015 06:19
    —
LonerD wrote:
Предыдущий - это вот этот имеешь в виду?
Его.
LonerD wrote:
Не очень-то и компактно
У тебя получилось компактней? Что-то не заметил. Smile
LonerD wrote:
Основная суть достигнута - получено значение retVal использовано дальше в скрипте.
А я как просил? Для SC, SI или SN (типа Send_WM_COPYDATA("SC") | msgbox retVal).

#29:  Author: LonerDLocation: Донецк PostPosted: Thu Apr 23, 2015 15:27
    —
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

#30:  Author: FlasherLocation: Москва PostPosted: Thu Apr 23, 2015 17:18
    —
LonerD wrote:
if ( retVal = "R" ) и три строки ниже на
msgbox, % retVal
Хм. Сравнение без %, а вывод с? Как интересно.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, 4  Next  :| |:
Page 2 of 4

Powered by phpBB © 2001, 2005 phpBB Group