программный редирект на файл

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
botace
Сообщения: 10
Зарегистрирован: Чт сен 29, 2005 22:14
Откуда: Moscow

программный редирект на файл

Сообщение botace »

Мож кто уже делал - как программно заставить тотал сфокусироваться на нужном мне файле в активной панели?
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Это подойдет?

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

cm_LoadSelectionFromClip
botace
Сообщения: 10
Зарегистрирован: Чт сен 29, 2005 22:14
Откуда: Moscow

Сообщение botace »

Немного не то. Это только выделяет файл, причем, если уже открыта нужная директория...
У меня есть полный путь к нужному файлу, нужно чтоб в активной панели открылась директория с этим файлом, и курсор встал на этот файл.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

botace
Написал скриптик на VBScript. Он использует TCWSHelper от Volniy.

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

'==================================
' Активизировать TC и перейти к указанному файлу

' В параметрах вызова скрипта должен быть указан полный путь файла, включая имя.
'==================================

Dim MyFile, TCS
Set MyFile = CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments(0))
Set TCS = CreateObject("TCScript.Helper")

Dim FileName, FilePath
FileName = MyFile.Name
FilePath = MyFile.ParentFolder

TCS.LockTC True
TCS.SendCommand(4003)
TCS.SendKeystroke("cd " & FilePath & "{Enter}")
TCS.SendCommand(2915)
TCS.SendKeystroke(FileName & "{Esc}")
TCS.LockTC False

Set TCS = Nothing
Set MyFile = Nothing
Wscript.Quit
Только есть небольшой трабл с текущей раскладкой. При включенной русской почему-то не работает. Сейчас уже нет времени отлаживать. Может Volniy поможет.
botace
Сообщения: 10
Зарегистрирован: Чт сен 29, 2005 22:14
Откуда: Moscow

Сообщение botace »

Спасибо за скриптик. Правда его я так и не использовал. Но, он меня навёл на одну интересную мыслю, которую я и воплотил :)
Кратко (убраны некоторые проверки окон) на сях получилось так:

Первая часть кода. (да, пришлось разделить на две части, т.к. тоталу требуется время на реагирование комманды смены каталога. Слитно две части не проходят никак). Итак, имеем:
HWND hWndTotal - Главное окно тотала
CString stPath - Путь без имени файла
CString stFile - Имя файла

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

// Поднимаем окно тотала, если оно было минимизированно...
::SendMessage( hWndTotal, WM_USER + 51, 2016, 0);

// Активируем левую панель
::SendMessage( hWndTotal, WM_USER + 51, 4001, 0);

// Ставим фокус на коммандную строку
::SendMessage( hWndTotal, WM_USER + 51, 4003, 0);

// Прописываем нужный нам путь в коммандную строку тотала
::SetWindowText( ::GetFocus(), CString( "cd ") + stPath); // Тут канечна желательно отследить, что фокус у нужного нам окна

// Софт-нажатие enter
::keybd_event( VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY, 0);
::keybd_event( VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

// Далее у меня установка себе таймера WM_TIMER через 0 мс. Т.к. это сообщение самое низкое по приоритету, очередь выборки у тотала успеет в любом случае разгребстись...
Вторая часть кода в обработке таймера:

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

// Включаем панель быстрого поиска
::SendMessage( hWndTotal, WM_USER + 51, 2915, 0);
// Тут кстати нада учитывать, что она работает по ON/OFF и после выдачи пред. комманды она на самом деле может выйти на OFF-состояние

// Имитируем набор символов в быстром поиске
LPCTSTR szFile = stFile;
HWND hWndCmdLine = ::GetFocus();
while( *szFile) ::SendMessage( hWndCmdLine, WM_CHAR, *szFile++, 0);

// Софт-нажатие escape
::keybd_event( VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY, 0);
::keybd_event( VK_ESCAPE, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
Вуаля...Тотал на нужном нам файле, причем текущая раскладка клавы абсолютно не канает :)
Ответить