Quote: |
Есть ли способ вызвать подменой (либо как-то иначе) другой плагин (или кнопку, или команду) вместо “штатного” сетевого окружения ? |
Rodny wrote: |
Не совсем понятно, что ты хочешь.
Чтобы кнопка "Сеть / FS-плагины" имела другую функцию? Нет, нельзя. |
MVV wrote: |
Если ты обрабатываешь в хуке сообщения клавы и мыши, ты можешь удалять невыгодные тебе сообщения ... |
HankHank wrote: |
Где только не встретишь наших людей ! |
HankHank wrote: |
Да ещё и сподобиться получить ответ от Гислера в тот же день. Хотя, по сути - пустой ответ. |
VadiMGP wrote: |
Я детально не штудировал твой пример, но две проблемы сразу заметны. Они касаются листбоксов (mylb1 и mylb2). |
VadiMGP wrote: |
1. Ты исходишь из предположения, что в ТС всегда 2 листбокса. Но это не так. Окна с деревьями тоже листбоксы, значит в разное время может быть от 2 до 4 листбоксов. |
Code: |
mylb1=FindWindowEx(hMainWnd, 0, L"TMyListBox", L""); |
VadiMGP wrote: |
2. Ты берешь HWND от них только один раз при инициализации. Но ТС часто уничтожает и создает листбоксы динамически. Например при переключении между режимами (подробный, эскизы, пользовательские колонки). |
Code: |
HWND GetActivePanel() { |
MVV wrote: |
В функции IsForbiddenLevelUp я беру текст из панели в строке состояния, |
MVV wrote: |
А сообщение LB_ITEMFROMPOINT по идее должно возвращать индекс с учетом того, что листбокс может иметь несколько колонок или строк. |
MVV wrote: |
Ты проверял, как работает LB_ITEMFROMPOINT, или это предположение? |
MVV wrote: |
В функции IsForbiddenLevelUp я беру текст из панели в строке состояния, текст в которой есть независимо от режима панели. |
VadiMGP wrote: | ||
Тогда может быть другое ложное срабатывание - при выходе из виртуальной папки. Если, к примеру, ты в Control Panel, то текст панели будет "\\Control Panel\*.*". |
MVV wrote: |
Вообще-то, конечно, "\\Панель управления>", но это детали. |
Code: |
|
Code: |
|
Code: |
|
Code: |
|
Code: |
|
Code: |
DWORD __stdcall BackgroundSendData(void* Data) { |
MVV wrote: |
Менять путь, посылая сообщение установки текста полю пути - извращение и маразм. ТК поддерживает специальное оконное сообщение WM_COPYDATA, в котором можно послать путь для перехода. Но надо это делать в фоновом потоке (у меня из плагина не работало, если в основном)... |
Code: |
|
HankHank wrote: |
И ещё немного оффтопа. |
HankHank wrote: | ||
Попробовал приладить код с вызовом фонового процесса, получилось так:
Компиллятор не взбрыкнул. Нужный процесс рождается. Код возврата thread ненулевой. Но эффекта - нет. Так и стоим на месте - на [..]. Подробнее пока не глядел. Может, свежим взглядом косяк виден сразу ? |
Code: |
struct BackgroundSendDataData { |
Code: |
bool ChangeCurrentDir(const char* Path, bool NewTab) { |
HankHank wrote: |
При нахождении “в среде плагина” попытка ввести “cd \\< IP или имя>” не приводит к успеху – надо слегка подриххтовать логику. Ты, впрочем, об этом вскользь уже говорил. |
MVV wrote: |
Ты выделил в стеке место для буфера и вписал в него путь. Далее, ты вызываешь фоновую функцию и передаешь ей адрес этого буфера, и не дожидаясь ее завершения выходишь из функции, в которой буфер был выделен, то есть, уничтожаешь его! |
MVV wrote: |
Еще один момент - плагин у юзера необязательно будет называться "net", имя можно дать любое в настройке FS-плагинов. |
MVV wrote: |
Кстати, заметил, что у меня может теряться память, если будет ошибка создания фонового потока. Модернизировал:… |
MVV wrote: |
На оффтоп отвечать не буду, раз модераторы против. Хотя, могу в личку. |
MVV wrote: | ||
…Ты вводишь команду для перехода в сетевую папку, находясь в папке плагина, и оно не работает (в ТК команда cd не работает в папках FS-плагинов; ты должен вручную реализовать обработку команды cd и изменить текущую папку - например, вызвав ChangeCurrentDir, как делает моя VirtualPanel), или ты пытаешься обойти хук с помощью команды cd (я говорил как раз об этом - не нужно блокировать команду cd, раз юзер пишет ее, у него есть на то причины), или же этот абзац тоже подразумевает установку текста командной строки и выполнение для смены папки (маловероятно, что ты имел в виду это, но вдруг)? |
HankHank wrote: |
Пользователю невдомёк, что командная строка работает по-разному в плагине и без него. Поэтому не хотелось бы забивать ему мозги ещё и такими деталями. И надо бы это как-то реализовать... Да, и в принципе, возможна ситуёвина, когда в обеих панелях уже плагин, а пользователь ещё и в командной строке набирает типа cd \\<хост>. |
Code: |
cd "путь\путь" не путь |
! | Avada: |
Тема перенесена. |
Avada wrote: |
Мне кажется, тему лучше перенести в подфорум "Написание плагинов", поскольку обсуждаемые вопросы — достаточно специфические. Нет возражений? |
HankHank wrote: |
В личке посмотри. |
HankHank wrote: | ||
Покуролесил с вчерашним кодом в свете твоего сообщения о динамической памяти:
Передаваемая процессу память никуда теперь не исчезает. Но код проще. (Пробовал static char buffer[]="cd \\\\\\net" и static char buffer[]="\\\\\\net".) Но что-то ничего не выходит… |
Code: |
<first_path>\r<second_path>\0<flags> |
Code: |
static char cdnet[]="\\\\\\net\r\0S"; |
MVV wrote: | ||
Видимо, ты плохо разобрался с форматом буфера для WM_COPYDATA, который ожидает ТК. Вот он:
Флаги: 'T' - в новой вкладке, 'S' - менять пути активной и неактивной панелей вместо левой и правой. |
MVV wrote: | ||
Таким образом, правильный буфер:
|
Quote: |
Если принимающая программа обрабатывает это сообщение, она должна возвратить значение ИСТИНА (TRUE); в противном случае она должна возвратить - ЛОЖЬ (FALSE). |
HankHank wrote: | ||||
Так ясно. По началу строчка wsprintf показалась заумной. И я решил, что хватит с меня и первого параметра с путём, куда надо переключить активную панель. А откуда эта инфо ? |
HankHank wrote: | ||||
Да, так работает. Буду ковать дальше. |
HankHank wrote: | ||
Ещё заметил такую деталь. Может, интересно кому.
Вот здесь http://www.firststeps.ru/mfc/winapi/win/r.php?126 прочитал про WM_COPYDATA:
У меня же передача параметров срабатывает, происходит переход куда требуется, но SendMessage возвращает при этом 0. |
Code: |
|
MVV wrote: |
Я ваще не пойму, какое отношение имеет мышиный хук к командной строке - вход в папку с помощью мыши в ТК никогда не затрагивал содержимого командной строки. |
MVV wrote: |
зачем тебе командная строка в пределах твоего плагина - какие там могут быть команды? |
MVV wrote: |
панель состояния - далеко не единственная панель в окне ТК, поэтому просто поиском окна с заданным классом искать ее не советую. |
Quote: |
А пользователю всё едино, если он зашёл в Коммандер – что плагин, что “штатные панели”. |
Quote: |
Каким разумным способом можно поискать командную строку и извлечь её содержимое ? |
Quote: |
Посмотрел попристальнее на командную строку в обычных режимах Коммандера и в плагине. |
Quote: |
Пока у меня в плагине осуществляется вылет в сетевое окружение коммандера (где все плагины) после двойного клика или нажатия Enter. |
MVV wrote: | ||
Между прочим, какую папку ты будешь делать текущей при выполнении команды из папки твоего плагина? У тебя она там попросту неопределена. Да и команда copy - это внутренняя команда командного интерпретатора Windows, она без него вообще не работает, а ему тоже нужна рабочая папка. |
Code: |
|
Code: |
|
MVV wrote: |
Юзай мой способ поиска панели с текущим путем (путь тебе все равно пригодится) - рядом (с тем же предком) будет окно командной строки. |
MVV wrote: | ||
Да, я об этом и говорил. Я сам иногда перехожу между папками мышью, чтобы не стирать набранную командную строку - и я не ожидаю, что она будет выполнена в этот момент. |
MVV wrote: | ||
То есть, ничего не работает? А как же хуки, которые блокируют команду и устанавливают нужный путь? |
Quote: |
Всё работает на ура. Ходьба вверх-вниз через итем [..] происходит лучше не придумаешь. На порядок лучше, чем в AHK. |
Quote: |
А вот вариант, когда дополнительно что-то введено в командную строку TC + в одной из панелей сетевое окружение моего плагина "на верхнем уровне" + в командной строке делаю двойной клик мышью или нажимаю Enter, - вот тогда происходит вылет на уровень выше, т.е в сетевое окружение коммандера (где список плагинов и прочее). А должна по идее выполниться командная строка. |
MVV wrote: |
Под сетевым окружением твоего плагина "на верхнем уровне" ты
понимаешь папку своего плагина? |
MVV wrote: |
Если в командной строке делать даблклик или жать Enter, ТК чисто выполняет командную строку, при этом папка не меняется (если, конечно, команда не cd).
|
MVV wrote: |
И этот клик по идее игнорируется хуками, так как при этом активное окно - не файловая панель. |
MVV wrote: |
И поведение это изменению не поддается, да и нет в том необходимости. |
MVV wrote: |
Или ты хочешь выполнять эту командную строку? |
Code: |
while (1) { |
MVV wrote: |
...при особом желании выполнить командную строку, которую ТК передаст тебе, вызывав функцию FsExecuteFile в момент нажатия юзером клавиши Enter или даблклике мышью по непустой командной строке. Извлекать текст командной строки при этом тебе абсолютно не нужно. |
MVV wrote: |
Замечу, что в этом месте может играть роль то, что плагин не поддерживает Юникод, так как командная строка может содержать юникод-символы не из системной кодовой страницы. Также при выполнении команды не забывай, что текущая рабочая папка не определена. |
output generated using printer-friendly topic mod. All times are GMT + 4 Hours