Решил выложить здесь свои небольшие наработки, суть наработок - получение сторонними программами (не плагинами) списка выделенных файлов от Total Commander.
Для начала - немного теории.
На настоящий момент существует следующая проблема: от TC очень сложно получить список выделенных файлов. Одним способом является отсылка команды CM_CopyFullNamesToClip = $7E2:
Код: Выделить всё
// 1. Хэндл окна Total Commander
TCHnd:= FindWindow('TTOTAL_CMD', Nil);
// 2. Получаем список выделенных файлов
if TCHnd<>0 then
begin
SaveClipboard; // сохраняем буфер обмена
SendMessage(TCHnd, EM_DISPLAYBAND, CM_CopyFullNamesToClip, 0); // после этой команды в буфере обмена находится список выделенных файлов
try
S:= Clipboard.AsText; // получаем этот список
except
on E: Exception do S:='';
end;
RestoreClipboard; // восстанавливаем буфер обмена
end;
Возможно, на самом деле способ существует, и если вам известен этот способ, то огромная просьба - сообщите об этом.
Таким образом, в функции SaveClipboard необходимо определить тип содержащейся там информации (всего типов 65536) и правильно эту информацию сохранить. Позже, в функции RestoreClipboard, сохранённый блок требуется вернуть на место.
Недавно вышла новая версия Total Commander'а, в которой эта проблема была частично решена. В history.txt было зявлено следующее:
В версиях 6.5x и ранее действительно нельзя было получить список файлов, использую Windows-команду LB_GETTEXT: вместо ожидаемых строк на выходе оказывались ссылки на неизвестный мне тип информации. Вообще говоря, этого и стоило ожидать: Ghisler использует возможности ListBox'a по максимуму, и свойство OwnerDraw давно уже было установлено в True.15.09.06 Release Total Commander 7.0a10 (alpha test version 10)
...
15.09.06 Added: Support for accessibility tools (e.g. for blind users) to main lists+separate tree+sync+CD-Tree, allows to retrieve current line via LB_GETTEXT
Но в версии 7.0 public beta 1, которой я сейчас и пользуюсь, появилась возможность получить при помощи LB_GETTEXT список выделенных файлов. Предлагаю вашему вниманию код (скачать можно здесь), показывающий способ использования этой возможности. Данный код написан на языке Object Delphi (кажется, теперь так Object Pascal называется). Основная часть размещена в .dpr - файле, связано это с особенностью работы функции GetForegroundWindow.
К сожалению, этот способ также имеет свои недостатки. На настоящий момент недостатков два, и все они связаны с видом строк, возвращаемых от TC.
Рассмотрим пример. Выделено 2 файла:
1.bmp 10000б дата_создания время_создания атрибуты
2.bmp 12500б дата_создания время_создания атрибуты
Проблема 1: TC возвращает строки в зависимости от набора колонок. При кратком виде отображения результирующие строки будут:
Код: Выделить всё
1.bmp
2.bmpКод: Выделить всё
1.bmp 10000 дата_создания время_создания атрибуты
2.bmp 12500 дата_создания время_создания атрибуты
Проблема 2: ТС возвращает строки, в которых значения столбцов отделены друг от друга символом ПРОБЕЛ. Это очень сильно затрудняет работу, так как пользователь может использовать пробел в именах файлов.
Но это нововведение с LB_GETTEXT уже сейчас здорово облегчило работу программистам, пишущим утилиты для TC.
P.S. Я написал письмо Ghisler'у, где изложил свои сображения по этому поводу. Одним из соображений была замена пробела на табулятор (#9), таким образом будет решена проблема №2.
P.P.S. Отсюда можно загрузить исполняемый файл, в архивах выше только исходный код.