Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Руководство по WM_COPYDATA
Goto page Previous  1, 2, 3, 4  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Wed Dec 03, 2014 00:54    Post subject: Reply with quote

MVV
Спасибо, буду пробовать, как доберусь до компа. Кстати, в примерах AutoHotkey после флагов нулевой символ не ставят, в функции на AutoIt тоже, кажется, не стал.
Вообще, производит впечатление своеобразного костыля для совместимости с неюникодными Win9x/Me: откуда я могу знать, какой путь попадётся? Проверять каждый раз, что символы строки не вылезли за диапазон 0-127 не очень удобно.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Wed Dec 03, 2014 15:20    Post subject: Reply with quote

Если конкатенируешь строки, обычно в конце нулевой символ добавляется автоматически. Но однозначно будет не лишним его указать явно, тем более, его необходимо учитывать в длине строки, а завершающий нулевой обычно не включается в длины строк.
А где костыль? Посылай всегда в UTF-8. Функция эта в тотале появилась давно, юникодные пути тогда еще не были в моде, потом была добавлена поддержка юникода с сохранением совместимости.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Wed Apr 22, 2015 03:42    Post subject: Reply with quote

Flasher wrote:
На англофоруме есть примеры для AHK.

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

И ещё - если тут кто-то из AHK-шников заглянет - каким образом команда CD работает? Потому как объяснения Balderstrom весьма туманны.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Apr 22, 2015 11:38    Post subject: Reply with quote

Там уже вроде как что-то отписали, но больше невнятицы про errorlevel.
Вот этот скрипт я попробовал на 1.1.05.02, gui возвращает данные. Теперь бы ещё по-отдельности отобразить, только с иероглифами первого значения получилось...
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Wed Apr 22, 2015 14:43    Post subject: Reply with quote

У меня с 1.1.21.03 ничего не показывает, активную панель скрипт показал только после изменения
Code:
inf:=Asc("G") + 256 * Asc("A")
;на
inf:=Asc("G") + 256 * Asc("W")

С 1.1.05.02 вообще ничего.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Wed Apr 22, 2015 14:45    Post subject: Reply with quote

Skif_off,
Видимо, твоя версия AHK юникодная, поэтому и идентификатор сообщения нужно указывать юникодный.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Wed Apr 22, 2015 15:47    Post subject: Reply with quote

MVV
Точно, проглядел
Quote:
I used autohotkey_L ansi version 1.1.05.01

Юникод рулит, однако. На AutoIt сразу делал с юникодом.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Wed Apr 22, 2015 15:48    Post subject: Reply with quote

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? Можно ли и нужно ли это делать?
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Apr 22, 2015 17:12    Post subject: Reply with quote

LonerD wrote:
Тогда тело скрипта будет выглядет так
А какого скрипта не хочешь рассказать? Smile
LonerD wrote:
Можно ли ещё проще?
Тут про функции нужно думать, там основной код.
LonerD wrote:
Можно ли и нужно ли это делать?
Думаю, нет необходимости.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Wed Apr 22, 2015 17:20    Post subject: Reply with quote

Flasher wrote:
LonerD wrote:
Тогда тело скрипта будет выглядет так
А какого скрипта не хочешь рассказать? Smile

Я выше в теме указал - вот этот скрипт. Насколько я понимаю, он и есть финальный. Его всё время и пытаюсь "осмыслить" и адаптировать для своих потребностей.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α


Last edited by LonerD on Wed Apr 22, 2015 18:29; edited 1 time in total
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Apr 22, 2015 17:30    Post subject: Reply with quote

LonerD
Финальный? Это просто вариант. Предыдущый как-то покомпактней смотрится. А тут какие-то навороты отладочные, ну их. Нужно скомпоновать самый наипростейший и компактный вариант с записью в переменную и msgbox для одного значения. В данном случае SС больше всего интересует.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Wed Apr 22, 2015 19:41    Post subject: Reply with quote

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
}

_________________
Win11 x64 Eng | TC DreamLair eternal pre-α


Last edited by LonerD on Thu Apr 23, 2015 15:28; edited 1 time in total
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 23, 2015 06:19    Post subject: Reply with quote

LonerD wrote:
Предыдущий - это вот этот имеешь в виду?
Его.
LonerD wrote:
Не очень-то и компактно
У тебя получилось компактней? Что-то не заметил. Smile
LonerD wrote:
Основная суть достигнута - получено значение retVal использовано дальше в скрипте.
А я как просил? Для SC, SI или SN (типа Send_WM_COPYDATA("SC") | msgbox retVal).
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Thu Apr 23, 2015 15:27    Post subject: Reply with quote

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
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 23, 2015 17:18    Post subject: Reply with quote

LonerD wrote:
if ( retVal = "R" ) и три строки ниже на
msgbox, % retVal
Хм. Сравнение без %, а вывод с? Как интересно.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3, 4  Next
Page 2 of 4

 
Jump to:  
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