Что нового

Total Commander: WM_COPYDATA и dwData='G'+256*'W'

Skif_off

Знающий
Сообщения
173
Репутация
12
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)

Тема на оффоруме (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() не сработало.
 
Автор
S

Skif_off

Знающий
Сообщения
173
Репутация
12
Чтобы принять сообщение, наличие GUI обязательно. Маленькое, но нужно.

З.Ы. Что-то все мои темы каки-то очевидные...:smile:
 
Верх