[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, User |
|
|
| ||
Есть чужое окно, в нем открыт стандартный диалог Открытия/сохранения файла. Хэндл окна Открытия/сохранения знаем. Как получить, какой файл в нем сейчас выбран (с полным путем) или хотябы сам путь? Перерыл кучу доки, нашел Message CDM_GETFOLDERPATH и CDM_GETFILEPATH, которые по документации с помощью SendMessage должны получать требуемые данные... НО! Это работает, только если SendMessage слать из того-же приложения, из которого открыт диалог. При посылке из другого приложения возвращается пустая строка... |
| ||
сделать принтскрин... отправить результат файнридеру... он тебе всё и распознает))))))))))))))))))))))))))))))))) |
| ||
Идея, конечно тупая... Мало того - не логичная: где ты в окне сохранения/открытия видишь полный путь??? Только если открыть ComboBox вверху... |
| ||
мдяяяя)) ноу комментс))) |
| ||
Слушай а может ошибка в том что хэндл выявлен не верно? Раз уж ты говоришь Это работает, только если SendMessage слать из того-же приложения, из которого открыт диалог. Ты ему какой хэндл в этом случае давал и в другом? |
| ||
Хэндл правильный. 100% Попробуй сам. Делал по документации: Var buf: array[0..1024] of Char; r: Integer; begin r:=SendMessage(DlgWnd, CDM_GETFOLDERPATH, SizeOf(buf), DWord(@buf)); end; в результате в buf должна быть строка=текущий путь, а в переменной r должна быть длина этого пути в символах. так вот в r попадает длина этого пути, причем правильная, а в buf пусто = одни нули. |
| ||
Счас попробую.... И ещё вопрос: Т.е. и в том и в другом случае (когда получалось и нет) DlgWnd был равен хэндлу диалога? А не типа Application.Handle :) И ещё где-то видел реализацию похожей темы, там при наведении курсора получался выделенный файл :) НО там правда hook устанавливали при создании диалогового окна :) |
| ||
Т.е. и в том и в другом случае (когда получалось и нет) DlgWnd был равен хэндлу диалога? А не типа Application.Handle :) нет. Хэндл я смотрел в AMN TaskManager. Именно хэндл окна диалога. В обоих случаях хэндл подставлял константой (конкретным числом.) |
| ||
И ещё где-то видел реализацию похожей темы, там при наведении курсора получался выделенный файл :) НО там правда hook устанавливали при создании диалогового окна :) Если вспомнишь, где такое видел, пожалуйста дай ссылку. hook наверняка ставился только на мышь... |
| ||
Да нет не на мышь :) Вообщем смотри пока я тут разбираюсь :) с кодом твоим... http://bcb.net.ru/article/disk/lovfile.html |
| ||
Это я уже видел... Там тоже мессага шлется из того-же приложения, из которого открыто окно диалога... Поэтому и работает... А из другого приложения ловушку не установишь. |
| ||
сейчас подписался на эху ru.delphi, там еще спрошу... |
| ||
Не в тему но всё же :) Выгоняют :), пошёл домой, может ночью что придёт :) Если решишь кидай сюда, интересно всякие новые штуки посмотреть :) |
| ||
Если есть доступ к исходнику чужого приложения, то используйте напишите его как сервер com, а если нетттт, то задача из разряда получить данные из адрессного пространства другого приложения под windows - работа для хакера с индивидуальным подходом к каждому из экземпляров запушенного приложения. вряд ли чудеса случаются и кто-то из разрабтчиков этого приложения побеспокоился о вас ;))) |
| ||
Где-то слышал: Полноценно работать с чужими окнами можно только находясь в контексте того приложения, в котором окна находятся. Может попробовать установить hook на окно и следить за всеми поступающими туда сообщениями? Может и перехватить что удастся? Если что пример смотри тут: http://borland.xportal.ru/forum/viewtopic.php?p=10937&sid=4ef30a38a66a0a0b6b95e6930049b219 |
| ||
А можно вообще хэндл контрола получить и из него все вытащить(например хэндл combobox'а и edit'a)! если что небольшой пример тут: http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=10490 |
| ||
2 _k_u_t_: исходников, естесственно, нет :( На счет получения данных из адресного пространства другой проги - это не сложно, но это прокатит, только если работать под правами админа, под правами юзера в память другой проги не залезешь :( 2 deadman: получить хэндлы всех контролов не проблема, но что это даст? Если бы в каком-нибудь контроле были трубуемые данный, то я бы их GetWindowText'ом вытащил... 2 All: Вообще все это мне нужно, чтоб сделать человеческое сохранения страниц в браузере Opera. Пол дела я уже сделал - чтоб в качестве имени по умолчанию подставлялся заголовок документа. Теперь хочу сделать, чтоб при сохранении файлы сохранялись в отдельную папку с идексным файлом вне этой папки, как это сделано в ослике. Обсуждение этой темы и моей программы здесь: http://forum.myopera.net/showflat.php?Cat=&Number=18398&page=0&view=collapsed&sb=5&o=&fpart=1 |
| ||
Что-то я не совсем понимаю как ты говоришь: Есть чужое окно, в нем открыт стандартный диалог Открытия/сохранения файла тогда какие проблемы? Есть хэндл окна? Получаем хэндл где поле ввода имени файла... Оттуда получаем имя файла... Тебе видно нужно знать ещё и какая папка выделена? Я прав или нет? |
| ||
Да, мне нужно знать именно папку. Имя файла я и так получил. Объясняю подробнее: Открыт SaveDialog. В нем выбрана текущая папка, в которую произойдет сохранение указанного пользователем файла. Мне нужно получить, в какую папку пойдет сохранение. |
| ||
В стандартном то диалоге открытия вроде ListView (там где сами-то папки :)) используется (если по Delph'овски говорить :)) Счас поищу там вроде было сообщение какое-то возвращает текущий выделенный... Вот только если multiselect то самому придёться подумать :) Вот вроде LVM_GETNEXTITEM: LVM_GETNEXTITEM wParam = (WPARAM) (int) iStart; lParam = MAKELPARAM((UINT) flags, 0); Parameters iStart Index of the item to begin the searching with, or -1 to find the first item that matches the specified flags. The specified item itself is excluded from the search. flags Geometric relation of the requested item to the specified item and, if specified, the state of the requested item. The geometric relation can be one of the following values: Value Meaning LVNI_ABOVE Searches for an item that is above the specified item. LVNI_ALL Searches for a subsequent item by index (the default value). LVNI_BELOW Searches for an item that is below the specified item. LVNI_TOLEFT Searches for an item to the left of the specified item. LVNI_TORIGHT Searches for an item to the right of the specified item. The state can be zero, or it can be one or more of the following values: Value Meaning LVNI_CUT The item has the LVIS_CUT state flag set. LVNI_DROPHILITED The item has the LVIS_DROPHILITED state flag set. LVNI_FOCUSED The item has the LVIS_FOCUSED state flag set. LVNI_SELECTED The item has the LVIS_SELECTED state flag set. If an item does not have all of the specified state flags set, the search continues with the next item. Return Values Returns the index of the next item if successful or -1 otherwise. Вывод: выбрать элемент с установленным флагом LVNI_SELECTED, а далее получить сам текст LVM_GETITEMTEXT. Вот только если в стандартном диалоге ListView используется....... А если нет..... :)) |
| ||
Ну так что получилось? :) Или я торможу :) |
| ||
Меня не интересует, что выделено в этом ListView. Меня интересует, какая папка открыта в этом ListView. Допустим, ты хочешь сохранить файл под таким именем и путем: c:1 mpprogramdemo.txt Для этого в диалоге сохранения ты выберешь папку c:1 mpprogram, затем введешь в строке имени файла demo.txt. Вот мне и нужно получить, какую папку ты выбрал - в данном случае c:1 mpprogram или опять плохо объяснил? |
| ||
Понял проблему, там отображается только текущая папка... |
| ||
Пока идей нет, остаётся копать только сообщения CDM_GETFOLDERPATH... |
| ||
На самом деле все просто: В вашей проге через удаленные потоки внедряете свою длл в адресное пространство оперы. В дллке при приходе DLL_PROCESS_ATTACH делаете сплайсинг функции GetSaveFileName из comdlg32.dll, тогда при попытке сохранения файла из оперы управление попадает к вам, вы делаете обратный сплайсинг, вызываете уже натуральный GetSaveFileName с переданым вам параметром при сплайсинге, смотрите что она возвращает и делаете с этим то что вам надо, снова делаете сплайсинг на случай если пользовать опять что-нибудь задумает сохранить и передаете управление опере возвращая структуру полученную от GetSaveFileName. P.S. Не забудьте произвести обратную подмену в DLL_PROCESS_DETACH. P.P.S Могу помочь своими исходниками (правда на Visual C++) |
| ||
Скинь на мыло bigtower@nm.ru :) Посмотрим на досуге :) |
| ||
Мне тоже скинь, пожалуйста. AcademSoft@mail.ru А такое пройдет под правами юзера? |
| ||
Если под Гостем никто не запускал вашу Оперу от имени администратора или системы через функцию CreateProcessAsUser, то все прокатит, а так так обычно все проги юзеры запускают через виндовый шелл (который так не делает) то все будет нормально. |