Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Подмена "штатного" сетевого окружения при возврате с хоста
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Thu Apr 15, 2010 16:48    Post subject: Подмена "штатного" сетевого окружения при возврате с хоста Reply with quote

Привет присутствующим.

Есть непростой вопросец для работы с удалённым компьютером.
Предположим, что переходим к удалённому хосту командой типа:
cd \\<IP-адрес или NetBIOS -имя> ,
задавая её в командной строке Коммандера.
Поработав на удалённом хосте, “возвращаемся назад”, многократно щёлкая кнопкой мыши или нажимая Enter на [..] (возврат на уровень вверх). Когда достигаем самого “верхнего уровня” хоста, по умолчанию (?) возвращаемся в “штатное” сетевое окружение Коммандера.

Есть ли способ вызвать подменой (либо как-то иначе) другой плагин (или кнопку, или команду) вместо “штатного” сетевого окружения ?

Есть решение с помощью AHK. Но оно не устраивает.
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Fri Apr 16, 2010 10:03    Post subject: Reply with quote

Буду благодарен за любые мысли вслух, пусть даже фантастические, чтобы выявить направления поиска...
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 939
Location: Могилёв, Беларусь

Post (Separately) Posted: Fri Apr 16, 2010 10:58    Post subject: Reply with quote

HankHank
Quote:
Есть ли способ вызвать подменой (либо как-то иначе) другой плагин (или кнопку, или команду) вместо “штатного” сетевого окружения ?

Не совсем понятно, что ты хочешь.
Чтобы кнопка "Сеть / FS-плагины" имела другую функцию? Нет, нельзя.
Кнопку/команду для перехода в определённый плагин? Пожалуйста, "cd \\\Плагин"
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Fri Apr 16, 2010 11:16    Post subject: Reply with quote

Rodny wrote:
Не совсем понятно, что ты хочешь.
Чтобы кнопка "Сеть / FS-плагины" имела другую функцию? Нет, нельзя.

Объясняю ещё раз.
После выхода из хоста, на который зашли по команде cd \\<имя хоста или его IP>, Коммандер выбрасывает пользователя не в окно, как ты пишешь "Сеть / FS-плагины" , а в сетевое окружение Коммандера. Я его условно называю "штатным". По сути, - это рабочая группа, полученная через механизм броузера Windows. Как это окно формируется Гислером, это тоже возможный путь для моей "подмены". Но я реализации пока не понимаю.

Вот ЕСТЬ НУЖДА МИНОВАТЬ ЭТО "ШТАТНОЕ", а перейти в другое АВТОМАТИЧЕСКИ - по команде, подменой кода или каким-то иным способом. Под "другим" окружением я разумею плагин, который можно вызвать перечисленными способами. Поэтому я и призываю спецов и любителей хотя бы пофантазировать на заданную тему, если отсутствует готовое решение.

Есть способ перехвата момента появления штатного окружения с помощью скрипта, о чём я написал ранее. Но получается некрасиво, долго, в целом - непрофессионально.

Так понятнее задача ?
Коротко она звучит так: "Отловить момент возврата из хоста и автоматичи передть управление не на штатное сетевое окружение, а на другой исполняемый код".


Last edited by HankHank on Fri Apr 16, 2010 11:26; edited 1 time in total
Back to top
View user's profile Send private message
alexey65536



Joined: 20 Jan 2006
Posts: 1032
Location: Taganrog

Post (Separately) Posted: Fri Apr 16, 2010 11:26    Post subject: Reply with quote

Т.е., допустим, нажав [..] в корне хоста \\COMP, я должен попадать не в WORKGROUP/MSHOME/что-то еще, а в произвольное место (плагин и т.п.)?
_________________
#199018
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Fri Apr 16, 2010 11:27    Post subject: Reply with quote

Так точно !
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4431
Location: Ростов-Дон

Post (Separately) Posted: Fri Apr 16, 2010 17:04    Post subject: Reply with quote

Объясню то, что написал на оф. форуме, но по-русски. Если ты обрабатываешь в хуке сообщения клавы и мыши, ты можешь удалять невыгодные тебе сообщения (обычно в конце хук-обработчика нужно вызывать CallNextHookEx, но в этих обработчиках можно просто вернуть ненулевое значение - и сообщение дальше твоего хука не пойдет). Т.е. ты ловишь попытку юзера нажать Enter или сделать двойной щелчок на элементе ".." до того как ТК получит это сообщение и, если видишь, что при таком раскладе юзер попадет в Сетевое окружение, просто удаляешь сообщение, а ТК говоришь перейти в нужный тебе каталог. В итоге ТК вообще не узнает о том, что юзер хотел зайти в Сетевое окружение.

Ловить двойной щелчок или нажатие Enter несложно, далее просто получаешь индекс текущего элемента - если ноль, значит, это элемент "..". Далее, если ноль (если не ноль, надо вызывать следующий обработчик и не тормозить систему лишний раз), начинаешь проверять текущий путь - например, как я писал, получаешь его из поля строки состояния (при инициализации плагина один раз получаешь его дескриптор и запоминаешь - он не изменится до закрытия ТК) и определяешь, верхний ли это уровень. Если да - действуешь.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Fri Apr 16, 2010 22:00    Post subject: Reply with quote

Чёрт побери, приятная неожиданность, MVV ! Где только не встретишь наших людей ! Very Happy
Да ещё и сподобиться получить ответ от Гислера в тот же день. Хотя, по сути - пустой ответ. Но мы не ищем лёгких путей.

MVV wrote:
Если ты обрабатываешь в хуке сообщения клавы и мыши, ты можешь удалять невыгодные тебе сообщения ...

Да, я понял мысль - написать собственный обработчик, о чём не имею понятия. Но тогда встаёт в полный рост вопрос:
Can you recommend samples of ready templates with a code of a similar trap for M$ Visual C++ ?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4431
Location: Ростов-Дон

Post (Separately) Posted: Fri Apr 16, 2010 22:16    Post subject: Reply with quote

HankHank wrote:
Где только не встретишь наших людей ! Very Happy

Наши везде пролезутSmile Я тут видел твое сообщение до того, как увидел там - поэтому понял, что то - твой пост, и отписался тут.

HankHank wrote:
Да ещё и сподобиться получить ответ от Гислера в тот же день. Хотя, по сути - пустой ответ.

Согласись, его можно понять - ты предлагаешь хардкодить граблиSmile

В общем, я набросал тебе пример, выложил в теме на оф. сайте.
Для экспериментов сделал копию папки проекта своей VP и извращался с ней. Very Happy
Вроде все работает. Хук-функции получились маленькие, работать будут быстро, тем более, быстрые отсекающие проверки делаются в первую очередь. Вопросы, комментарии - вэлкам.

Как я уже советовал там, лучше при переходе из плагина по сетевому пути запоминать его корневую папку (имя сервера) - и при 'подъеме' проверять, на этом ли серваке юзер (а то может он уже ушел гулять по другим, а ты ему будешь малину портить).
Кстати, в настройках своего плагина сделай опцию отключать эти извращения - хуки можно не вырубать, а при входе в них сразу проверяй флаг и выходи из хук-функции (не забудь вызывать CallNextHookEx) - проще всего добавить условный блок верхнего уровня, внутри которого проверяются и обрабатываются сообщения. То есть, юзер отключил фишку - сразу вызываешь следующий хук.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
HankHank



Joined: 15 Apr 2010
Posts: 31

Post (Separately) Posted: Fri Apr 16, 2010 23:16    Post subject: Reply with quote

Сердечная благодарность за помощь. На неделе попытаюсь разобраться и прикрутить. Вопросы наверняка появятся.
Хороших выходных !
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1624

Post (Separately) Posted: Sun Apr 18, 2010 01:41    Post subject: Reply with quote

MVV
Я детально не штудировал твой пример, но две проблемы сразу заметны. Они касаются листбоксов (mylb1 и mylb2).
1. Ты исходишь из предположения, что в ТС всегда 2 листбокса. Но это не так. Окна с деревьями тоже листбоксы, значит в разное время может быть от 2 до 4 листбоксов.
2. Ты берешь HWND от них только один раз при инициализации. Но ТС часто уничтожает и создает листбоксы динамически. Например при переключении между режимами (подробный, эскизы, пользовательские колонки).
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4431
Location: Ростов-Дон

Post (Separately) Posted: Sun Apr 18, 2010 10:24    Post subject: Reply with quote

VadiMGP wrote:
Я детально не штудировал твой пример, но две проблемы сразу заметны. Они касаются листбоксов (mylb1 и mylb2).

Что ж, я не давал клятву, что он идеален. Smile

VadiMGP wrote:
1. Ты исходишь из предположения, что в ТС всегда 2 листбокса. Но это не так. Окна с деревьями тоже листбоксы, значит в разное время может быть от 2 до 4 листбоксов.

Да, действительно. Но я заметил, что у листбоксов деревьев имя текст окна не пуст, значит, можно искать окна файловых панелей по пустому тексту. Тогда в моем примере надо чуть изменить (указать не любой, а пустой текст окна при поиске):
Code:
   mylb1=FindWindowEx(hMainWnd, 0, L"TMyListBox", L"");
   mylb2=FindWindowEx(hMainWnd, mylb1, L"TMyListBox", L"");

Так мы гарантированно найдем окна панелей. Кстати, по идее можно просто брать активное окно, а не искать их - оно будет листбоксом при щелчке мышью и нажатии клавиш в интересующий нас момент.

VadiMGP wrote:
2. Ты берешь HWND от них только один раз при инициализации. Но ТС часто уничтожает и создает листбоксы динамически. Например при переключении между режимами (подробный, эскизы, пользовательские колонки).

Подтверждаю. Тоже не учел. В таком случае нужно либо искать окна панелей каждый раз (два окна найти - не проблема), а можно просто использовать указанный выше фокус. То есть, вызываем GetFocus(), и если окно с фокусом - TMyListBox, значит, берем из него индекс и т.д. Панель состояния в любом случае не изменяется.

Итак, убираем дескрипторы mylb1, mylb2 и их поиск, а функцию GetActivePanel модифицируем следующим образом:
Code:
HWND GetActivePanel() {
   HWND hwnd=GetFocus();
   wchar_t buf[256];
   if (!GetClassName(hwnd, buf, TSIZE(buf)) || lstrcmp(buf, L"TMyListBox")) return 0;
   if (GetWindowText(hwnd, buf, TSIZE(buf)) || GetLastError()) return 0;
   return hwnd;
}

Ну а в хук-функциях проверять, не ноль ли дескриптор окна - если ноль, ниче не делать.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1624

Post (Separately) Posted: Sun Apr 18, 2010 11:01    Post subject: Reply with quote

Еще одна проблема - будет ложное срабатывание в режиме эскизов.
Если в строке, скажем, 3 эскиза, то LB_ITEMFROMPOINT вернет 0 для любого из этих трех эскизов, а не только для "..".

Добавлено. Пригляделся еще раз. Нет, похоже, не будет вообще срабатывания. В функции IsForbiddenLevelUp GetWindowText не даст текста. В режиме эскизов невозможно получить текст элемента.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4431
Location: Ростов-Дон

Post (Separately) Posted: Sun Apr 18, 2010 12:29    Post subject: Reply with quote

В функции IsForbiddenLevelUp я беру текст из панели в строке состояния, текст в которой есть независимо от режима панели. Текст элементов я вообще нигде не пытаюсь получить - он мне не нужен, расчет на то, что элемент ".." всегда имеет индекс 0.

А сообщение LB_ITEMFROMPOINT по идее должно возвращать индекс с учетом того, что листбокс может иметь несколько колонок или строк. Ты проверял, как работает LB_ITEMFROMPOINT, или это предположение?

Да, похоже, в режиме эскизов LB_ITEMFROMPOINT работает неправильно - действительно возвращает номер строки. Как, кстати, и LB_GETCARETINDEX - видимо, этот режим Гислер реализовывал сам, и об этих сообщениях не позаботился. Так что оба хука - и клавы, и мыши - будут срабатывать в режиме эскизов на всех элементах первой строки содержимого панели. Нужно что-то придумывать дополнительно.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…


Last edited by MVV on Sun Apr 18, 2010 12:49; edited 4 times in total
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1624

Post (Separately) Posted: Sun Apr 18, 2010 12:37    Post subject: Reply with quote

MVV wrote:
В функции IsForbiddenLevelUp я беру текст из панели в строке состояния,
А, значит я ошибся насчет этого.
MVV wrote:
А сообщение LB_ITEMFROMPOINT по идее должно возвращать индекс с учетом того, что листбокс может иметь несколько колонок или строк.
По идее, конечно. Я тоже в свое время на это рассчитывал.
MVV wrote:
Ты проверял, как работает LB_ITEMFROMPOINT, или это предположение?
Еще как проверял. Я знаешь, как в TWinKey нажрался проблем с эскизами... Мама не горюй.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group