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

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

Добавлено: Вт окт 04, 2005 23:59
botace
Мож кто уже делал - как программно заставить тотал сфокусироваться на нужном мне файле в активной панели?

Добавлено: Ср окт 05, 2005 00:07
Volniy
Это подойдет?

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

cm_LoadSelectionFromClip

Добавлено: Ср окт 05, 2005 00:18
botace
Немного не то. Это только выделяет файл, причем, если уже открыта нужная директория...
У меня есть полный путь к нужному файлу, нужно чтоб в активной панели открылась директория с этим файлом, и курсор встал на этот файл.

Добавлено: Ср окт 05, 2005 11:22
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 поможет.

Добавлено: Ср окт 05, 2005 22:40
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);
Вуаля...Тотал на нужном нам файле, причем текущая раскладка клавы абсолютно не канает :)