Перехватить стандартный Save As диалог.
От: Mr.Jazz  
Дата: 25.08.10 10:17
Оценка:
Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).
Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.
Буду благодарен за любую помощь.
Re: Перехватить стандартный Save As диалог.
От: Qa1888  
Дата: 25.08.10 14:07
Оценка:
можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?

MJ>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).

MJ>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

MJ>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.

MJ>Буду благодарен за любую помощь.
Re[2]: Перехватить стандартный Save As диалог.
От: Qa1888  
Дата: 25.08.10 14:09
Оценка:
всмысле какая именно программа интересует? Тут для разных приложений и операционисток разные типы способов.

Q>можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?


MJ>>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).

MJ>>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

MJ>>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.

MJ>>Буду благодарен за любую помощь.
Re[3]: Перехватить стандартный Save As диалог.
От: Mr.Jazz  
Дата: 27.08.10 12:30
Оценка:
Здравствуйте, Qa1888, Вы писали:

Q>всмысле какая именно программа интересует? Тут для разных приложений и операционисток разные типы способов.


Q>>можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?


MJ>>>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).

MJ>>>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

MJ>>>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.

MJ>>>Буду благодарен за любую помощь.

Вот эта программа http://upload.com.ua/get/901860506/.
Это программа для работы с GPS логгером.
А именно интересует диалог "Экспорт треков".
Нужно перехватить имя файла и путь,когда пользователь нажмёт на кнопку "сохранить".
Re[4]: Перехватить стандартный Save As диалог.
От: Qa1888  
Дата: 27.08.10 20:18
Оценка: +1
"Экспорт треков" команда не активна, не могу увидеть. Но там была "сохранить проект", думаю что в экспорте тем же образом реализовано

Короче? тут судя по всему используется функция GetSaveFileNameW. Вам повезло, в висте и семерке она тоже, сужу по тому что диалог выглядит так же как и в xp.
Дело в том что диалог сохранения в виста/7 у многих прог другой, есть механизм вызова выбора файла через ком. Обычно это все скрыто оболочками типа CFileDialog и аналогичными. А вот тогда было бы много гемора с выбором.

Тут вам надо перехватить функцию GetSaveFileNameW, пропатчите. После вызова оригинала смотрите че функция вернула, если не 0, то в структуре LPOPENFILENAME
сможете найти путь. И отослать уже вашему приложению данные.

Это первый путь. Второй что при выборе и нажатии ок, отсылается CDN_FILEOK notification. В msdn можете подробности найти. Там же написано что это не для всех диалогов,
а только которые созданы используя OFN_EXPLORER. Таков ли этот диалог надо проверять.
Re: Перехватить стандартный Save As диалог.
От: maks__  
Дата: 10.09.10 10:41
Оценка:
MJ>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).
MJ>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

Не уверен, что это самый простой способ, но он 100% рабочий.

Устанавливаете системный хук на WH_CALLWNDPROCRET. В нужный процесс загружаете свою dll.
В WH_CALLWNDPROCRET WM_INITDIALOG отлавливаете нужное окно через просмотр контролов — диалог сохранения. Теперь ваш код выполняется внутри нужного процесса и у вас есть хендл нужного окна.
Отлавливаете закрытие диалога по WM_DESTROY. Проверяете, что не было нажато Cancel.
Получаете у диалога выбранный пользователем путь — задача нетривиальная , но есть готовые решения через WM_GETISHELLBROWSER или CDM_GETFOLDERIDLIST.

Пример, как все это сделать см тут http://www.hyperionics.com/
Re: Перехватить стандартный Save As диалог.
От: CEMb  
Дата: 12.09.10 17:15
Оценка:
Здравствуйте, Mr.Jazz, Вы писали:

MJ>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).

MJ>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.

MJ>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.

MJ>Буду благодарен за любую помощь.

Эта указатель на твою функцию, которая будет вызываться перед вызовом родной функции от GetOpenFileName, т.е. по идее, ты из неё можешь в WM_COMMAND поймать событие нажатия кнопки сохранить (ID кнопки смотрим Spy++). Я сам никогда не пробовал.

Далее. Программа чужая. Ищем тут, на рсдн-е (чудесную) статью про перехват WinAPI вызовов. Читаем. Ищем Рихтера что-то там про программирование под виндоус и внедрение в чужой код через LoadLibrary и CreateRemoteThread. Читаем. Я обычно это хуками делаю, через WM_NULL, как альтернатива CreateRemoteThread, мне кажется, так проще. Встраиваемся в код хуком, или удалённым тредом, перехватываем GetOpenFileName, внутри в структуре прописываем свой адрес для OFNHookProc, не забыв сохранить чужой, если был(и позвать его после своей хук-функции), зовём родную GetOpenFileName и сидим в своей OFNHookProc ждём, когда прилетит WM_COMMAND с нужным идом
На выходе не забудь вернуть родной GetOpenFileName на место
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.