WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема Получить имя файла из SaveDialog К предыдущему сообщению На следующее сообщение Программирование

Отправил Academic в 15:35 22.01.2005[Ответить]
Есть чужое окно, в нем открыт стандартный диалог Открытия/сохранения файла. Хэндл окна Открытия/сохранения знаем. Как получить, какой файл в нем сейчас выбран (с полным путем) или хотябы сам путь?

Перерыл кучу доки, нашел Message CDM_GETFOLDERPATH и CDM_GETFILEPATH, которые по документации с помощью SendMessage должны получать требуемые данные... НО! Это работает, только если SendMessage слать из того-же приложения, из которого открыт диалог. При посылке из другого приложения возвращается пустая строка...


Отправил Sleep-Walker в 21:02 22.01.2005[Ответить]
сделать принтскрин... отправить результат файнридеру... он тебе всё и распознает)))))))))))))))))))))))))))))))))


Отправил Academic в 21:04 22.01.2005[Ответить]
Идея, конечно тупая...
Мало того - не логичная: где ты в окне сохранения/открытия видишь полный путь??? Только если открыть ComboBox вверху...


Отправил Sleep-Walker в 21:14 22.01.2005[Ответить]
мдяяяя)) ноу комментс)))


Отправил deadman в 22:11 22.01.2005[Ответить]
Слушай а может ошибка в том что хэндл выявлен не верно? Раз уж ты говоришь

Это работает, только если SendMessage слать из того-же приложения, из которого открыт диалог.

Ты ему какой хэндл в этом случае давал и в другом?


Отправил Academic в 22:30 22.01.2005[Ответить]
Хэндл правильный.
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 пусто = одни нули.


Отправил deadman в 22:34 22.01.2005[Ответить]
Счас попробую....

И ещё вопрос:

Т.е. и в том и в другом случае (когда получалось и нет) DlgWnd был равен хэндлу диалога? А не типа Application.Handle :)

И ещё где-то видел реализацию похожей темы, там при наведении курсора получался выделенный файл :) НО там правда hook устанавливали при создании диалогового окна :)


Отправил Academic в 22:43 22.01.2005[Ответить]
Т.е. и в том и в другом случае (когда получалось и нет) DlgWnd был равен хэндлу диалога? А не типа Application.Handle :)

нет. Хэндл я смотрел в AMN TaskManager. Именно хэндл окна диалога. В обоих случаях хэндл подставлял константой (конкретным числом.)


Отправил Academic в 22:48 22.01.2005[Ответить]
И ещё где-то видел реализацию похожей темы, там при наведении курсора получался выделенный файл :) НО там правда hook устанавливали при создании диалогового окна :)

Если вспомнишь, где такое видел, пожалуйста дай ссылку.

hook наверняка ставился только на мышь...


Отправил deadman в 22:52 22.01.2005[Ответить]
Да нет не на мышь :)

Вообщем смотри пока я тут разбираюсь :) с кодом твоим...

http://bcb.net.ru/article/disk/lovfile.html


Отправил Academic в 22:55 22.01.2005[Ответить]
Это я уже видел...
Там тоже мессага шлется из того-же приложения, из которого открыто окно диалога... Поэтому и работает...

А из другого приложения ловушку не установишь.


Отправил Academic в 22:56 22.01.2005[Ответить]
сейчас подписался на эху ru.delphi, там еще спрошу...


Отправил deadman в 22:59 22.01.2005[Ответить]
Не в тему но всё же :)

Выгоняют :), пошёл домой, может ночью что придёт :) Если решишь кидай сюда, интересно всякие новые штуки посмотреть :)


Отправил _k_u_t_ в 10:35 23.01.2005[Ответить]
Если есть доступ к исходнику чужого приложения, то используйте напишите его как сервер com, а если нетттт, то задача из разряда получить данные из адрессного пространства другого приложения
под windows - работа для хакера с индивидуальным подходом к каждому из экземпляров запушенного приложения.
вряд ли чудеса случаются и кто-то из разрабтчиков этого приложения побеспокоился о вас ;)))


Отправил deadman в 12:34 23.01.2005[Ответить]
Где-то слышал:

Полноценно работать с чужими окнами можно только находясь в контексте того приложения, в котором окна находятся.

Может попробовать установить hook на окно и следить за всеми поступающими туда сообщениями? Может и перехватить что удастся? Если что пример смотри тут:

http://borland.xportal.ru/forum/viewtopic.php?p=10937&sid=4ef30a38a66a0a0b6b95e6930049b219


Отправил deadman в 13:01 23.01.2005[Ответить]
А можно вообще хэндл контрола получить и из него все вытащить(например хэндл combobox'а и edit'a)!

если что небольшой пример тут:

http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=10490


Отправил Academic в 13:40 23.01.2005[Ответить]
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


Отправил deadman в 15:19 23.01.2005[Ответить]
Что-то я не совсем понимаю как ты говоришь: Есть чужое окно, в нем открыт стандартный диалог Открытия/сохранения файла тогда какие проблемы? Есть хэндл окна? Получаем хэндл где поле ввода имени файла... Оттуда получаем имя файла... Тебе видно нужно знать ещё и какая папка выделена? Я прав или нет?


Отправил Academic в 15:22 23.01.2005[Ответить]
Да, мне нужно знать именно папку. Имя файла я и так получил.

Объясняю подробнее:
Открыт SaveDialog. В нем выбрана текущая папка, в которую произойдет сохранение указанного пользователем файла. Мне нужно получить, в какую папку пойдет сохранение.


Отправил deadman в 15:44 23.01.2005[Ответить]
В стандартном то диалоге открытия вроде 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 используется....... А если нет..... :))


Отправил deadman в 16:04 23.01.2005[Ответить]
Ну так что получилось? :) Или я торможу :)


Отправил Academic в 16:06 23.01.2005[Ответить]
Меня не интересует, что выделено в этом ListView.
Меня интересует, какая папка открыта в этом ListView.

Допустим, ты хочешь сохранить файл под таким именем и путем:
c:1 mpprogramdemo.txt

Для этого в диалоге сохранения ты выберешь папку
c:1 mpprogram,
затем введешь в строке имени файла demo.txt.

Вот мне и нужно получить, какую папку ты выбрал - в данном случае
c:1 mpprogram

или опять плохо объяснил?



Отправил deadman в 16:09 23.01.2005[Ответить]
Понял проблему, там отображается только текущая папка...


Отправил deadman в 16:28 23.01.2005[Ответить]
Пока идей нет, остаётся копать только сообщения CDM_GETFOLDERPATH...


Отправил bargan в 17:20 23.01.2005[Ответить]
На самом деле все просто:

В вашей проге через удаленные потоки внедряете свою длл в адресное пространство оперы. В дллке при приходе DLL_PROCESS_ATTACH делаете сплайсинг функции GetSaveFileName из comdlg32.dll, тогда при попытке сохранения файла из оперы управление попадает к вам, вы делаете обратный сплайсинг, вызываете уже натуральный GetSaveFileName с переданым вам параметром при сплайсинге, смотрите что она возвращает и делаете с этим то что вам надо, снова делаете сплайсинг на случай если пользовать опять что-нибудь задумает сохранить и передаете управление опере возвращая структуру полученную от GetSaveFileName.

P.S. Не забудьте произвести обратную подмену в DLL_PROCESS_DETACH.

P.P.S Могу помочь своими исходниками (правда на Visual C++)



Отправил deadman в 18:20 23.01.2005[Ответить]
Скинь на мыло bigtower@nm.ru :) Посмотрим на досуге :)


Отправил Academic в 19:00 23.01.2005[Ответить]
Мне тоже скинь, пожалуйста. AcademSoft@mail.ru
А такое пройдет под правами юзера?


Отправил bargan в 21:09 23.01.2005[Ответить]
Если под Гостем никто не запускал вашу Оперу от имени администратора или системы через функцию CreateProcessAsUser, то все прокатит, а так так обычно все проги юзеры запускают через виндовый шелл (который так не делает) то все будет нормально.