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 

Single Post  Topic: Руководство по WM_COPYDATA 
Author Message
LonerD



PostPosted: Wed Apr 22, 2015 20:29    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
}

_________________
Windows 11 | TC DreamLair eternal pre-α


Last edited by LonerD on Thu Apr 23, 2015 15:28; edited 1 time in total
View user's profile Send private message Visit poster's website ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group