Страница 1 из 4

Руководство по WM_COPYDATA

Добавлено: Пн ноя 03, 2014 12:30
Dec
Существует ли в природе полное руководство по командам и параметрам, используемым в сообщении WM_COPYDATA при работе с TC?

Добавлено: Пн ноя 03, 2014 12:43
Flasher
На англофоруме есть примеры для AHK.

Добавлено: Пн ноя 03, 2014 13:30
CaptainFlint
Dec
Можно скачать полную историю версий, в ней несколько сжато, но в целом внятно описаны возможности Тотала при работе с этим сообщением.

Добавлено: Пн ноя 03, 2014 14:04
Skif_off
CaptainFlint писал(а):Dec
Можно скачать полную историю версий
А где? На офсайте не нашёл, в HISTORY.TXT только 4е упоминания WM_COPYDATA.

Добавлено: Пн ноя 03, 2014 14:13
Dec
CaptainFlint писал(а):Dec
Можно скачать полную историю версий.
Ссылку не подскажешь?

Добавлено: Пн ноя 03, 2014 14:33
CaptainFlint

Добавлено: Пн ноя 03, 2014 14:44
Dec
Я нашел следующее:
25.11.11 Added: Send WM_COPYDATA with dwData='G'+256*'W': Same as with 'G'+256*'A', but data is returned as UTF-16 Unicode. dwData of return is 'R'+256*'W' (32/64)
25.11.11 Added: Send WM_COPYDATA with dwData='G'+256*'A' and lpData pointing to command to get back WM_COPYDATA with various info. Supported commands A: Active side (returns L or R), or two byte command: first byte: L=left, R=right, S=source, T=target. Second byte: P=current path, C=list count, I=caret index, N=name of file under caret. dwData of return is 'R'+256*'A' (32/64)

09.12.07 Added: Unicode support in WM_COPYDATA: prepend UTF8 byte order marker before each path containing Unicode characters (pure ANSI paths are passed as ANSI) -> /O switch now supports Unicode too

17.09.06 Added: Send WM_COPYDATA with dwData='E'+256*'M' and lpData pointing to em_xyz internal command (0-terminated) to execute that command. Accepts parameters separated by a space

12.04.06 Added: Support for environment variables in paths received via WM_COPYDATA from other programs
Т.е. по сути есть только 3 "команды": GW, GA и EM. Я правильно понимаю?

Добавлено: Пн ноя 03, 2014 16:25
CaptainFlint
Dec
Странно, мне казалось, там все команды описаны. В общем, есть ещё CD для перехода в другой каталог на одной или обеих панелях. Строка lpData должна быть в следующем формате (пример для языка C/C++):
"c:\\test1\x0dc:\\test2\x00ST\x00"
Первый путь — левая панель, второй — правая; любой из них может быть опущен (но симмвол-разделитель \x0d должен оставаться). Флаги после первого нулевого символа опциональны. "S": трактовать пути как исходный/целевой; "T": открывать пути в новых вкладках.

Добавлено: Вт ноя 04, 2014 16:01
MVV
Flasher писал(а):На англофоруме есть примеры для AHK.
Там не только для AHK примеры. :wink:
Но топик является наиболее подробным обсуждением сообщений, посылаемых через WM_COPYDATA, есть примеры реализации на разных языках, в том числе для команды CD.

Добавлено: Вт ноя 04, 2014 16:10
Flasher
MVV писал(а):Там не только для AHK примеры. :wink:
Да я уже видел, не стал акцентировать. Dec не вчера "родился", чтобы самостоятельно оценить. :wink:

Добавлено: Вт дек 02, 2014 19:20
Skif_off
CD поддерживает юникод? Или только ANSI?

Добавлено: Вт дек 02, 2014 19:26
Flasher
Поддерживает.

Добавлено: Вт дек 02, 2014 19:42
MVV
Skif_off,
Поддерживает UTF-8. Синтаксис можно посмотреть тут.

Добавлено: Вт дек 02, 2014 20:10
Skif_off
MVV
Смущает вот это
09.12.07 Added: Unicode support in WM_COPYDATA: prepend UTF8 byte order marker before each path containing Unicode characters (pure ANSI paths are passed as ANSI)
Маркер? Т.е. просто всегда дописывать \xEF\xBB\xBF перед каждым путём?
Если нет, например, пути для левой панели, тогда так

Код: Выделить всё

["\xEF\xBB\xBF"] "\x0D" ["\xEF\xBB\xBF"] ["<right_path>"] "\x00" ["S"] ["T"] "\x00"
?
В случае отсутствия флагов S/T, команда должна заканчиваться двумя \x00?

Надо ещё разобраться с \x00: на AutoIt, кажется, не добавлял в конце, но работало.

Добавлено: Вт дек 02, 2014 21:11
MVV
Маркер? Т.е. просто всегда дописывать \xEF\xBB\xBF перед каждым путём?
Да. Перед левым и перед правым свои маркеры, указывающие, что конкретно этот путь в UTF-8. На схеме показаны оба, и оба необязательные.
Если нет, например, пути для левой панели, тогда так?
Если нет пути для какой-то панели, то и её маркер не нужен. Не знаю, что будет, если маркер будет, а пути не будет, хотя по логике он тогда должен игнорироваться, т.к. путь все равно пуст. Главное, чтобы в команде были символ конца строки и два нулевых байта.
В случае отсутствия флагов S/T, команда должна заканчиваться двумя \x00?
Да, все элементы в квадратных скобках можно выкидывать, остальное писать надо.
Не забудь в поле размера данных учесть эти два нулевых байта, чтобы они корректно переслались тоталу.