25.11.11 Добавлено: Посылка команды WM_COPYDATA с параметром dwData='G'+256*'W': То же, что и для значения 'G'+256*'A', но результат будет в юникодном формате UTF-16. Значение dwData ответного сообщения равно 'R'+256*'W'. (32/64)
25.11.11 Добавлено: Посылка команды WM_COPYDATA с параметром dwData='G'+256*'A' и lpData, указывающим на строку с командой, для получения различной информации посредством обратной посылки WM_COPYDATA из TC в исходное приложение. Поддерживаемые команды: 'A' - активная панель (возвращает 'L' или 'R'), а также двухбайтовые команды: первый байт - L=левая панель, R=правая, S=исходная, T=целевая; второй байт - P=текущий путь, C=количество объектов, I=позиция курсора, N=имя объекта под курсором. Значение dwData ответного сообщения равно 'R'+256*'A'. (32/64)
25.11.11 Добавлено: Посылка команды WM_COPYDATA с параметром dwData='G'+256*'A' и lpData, указывающим на строку с командой, для получения различной информации посредством обратной посылки WM_COPYDATA из TC в исходное приложение. Поддерживаемые команды: 'A' - активная панель (возвращает 'L' или 'R'), а также двухбайтовые команды: первый байт - L=левая панель, R=правая, S=исходная, T=целевая; второй байт - P=текущий путь, C=количество объектов, I=позиция курсора, N=имя объекта под курсором. Значение dwData ответного сообщения равно 'R'+256*'A'. (32/64)
Тема на оффоруме (AutoHotkey преимущественно, но есть и другие языки), откуда взят пример на AutoIt и слегка подправлен (юникод + чуть сокращён):
Код:
#include <GUIConstantsEx.au3>
;#include <SendMessage.au3>
Global Const $WM_COPYDATA = 0x004A
Opt('GUIOnEventMode', 1)
Global $hGUI
_Main()
Func _Main()
Local $iBtn
$hGUI = GUICreate('Test', 150, 50)
GUISetOnEvent($GUI_EVENT_CLOSE, 'Event_GUIClose')
$iBtn = GUICtrlCreateButton('Click Here', 10, 10, 100, 30)
GUICtrlSetOnEvent(-1, 'handle_button_press')
; This registers the function to call when we receive a WM_COPYDATA (0x004A) back from TC:
GUIRegisterMsg(0x004A, 'Our_Func_for_WM_COPYDATA')
GUISetState()
While 1
Sleep(500)
WEnd
EndFunc ;==>_Main
Func _Msg2TC($prmCommand = "LP")
$hTC = WinGetHandle("[CLASS:TTOTAL_CMD]")
$dwData = Asc("G") + 256 * Asc("W")
$lpDataLen = StringLen($prmCommand)
$lpData = DllStructCreate("char[" & $lpDataLen + 1 & "]")
DllStructSetData($lpData, 1, $prmCommand)
$lpDataPtr = DllStructGetPtr($lpData)
$structCOPYDATA = DllStructCreate("ulong_ptr;dword;ptr")
DllStructSetData($structCOPYDATA, 1, $dwData)
DllStructSetData($structCOPYDATA, 2, $lpDataLen)
DllStructSetData($structCOPYDATA, 3, $lpDataPtr)
$ptrCOPYDATA = DllStructGetPtr($structCOPYDATA)
; $arrReturn = _SendMessage($hTC, 0x004A, $hGUI, $ptrCOPYDATA)
$arrReturn = DllCall("user32.dll", "int", "SendMessageW", "hwnd", $hTC, "uint", $WM_COPYDATA, "wparam", $hGUI, "lparam", $ptrCOPYDATA)
EndFunc
Func Our_Func_for_WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam)
$returnCOPYDATA = DllStructCreate("ulong_ptr;dword;ptr", $lParam)
$returnDWData = DllStructGetData($returnCOPYDATA, 1)
$returnLPDataLen = DllStructGetData($returnCOPYDATA, 2)
$returnLPDataPtr = DllStructGetData($returnCOPYDATA, 3)
$returnLPData = DllStructCreate("wchar[" & $returnLPDataLen + 1 & "]", $returnLPDataPtr)
$retValue = DllStructGetData($returnLPData, 1)
; Avoid MsgBox in real life at this point (see AutoIt Help 'GUIRegisterMsg')
MsgBox(0, "TC Reply", $retValue)
EndFunc
Func handle_button_press()
_Msg2TC()
EndFunc
Func Event_GUIClose()
Exit
EndFunc
Подскажите, пожалуйста, как можно получить WM_COPYDATA без GUI? C AdlibRegister() не сработало.