Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот).
Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.
Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования.
Буду благодарен за любую помощь.
можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?
MJ>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот). MJ>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.
MJ>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования. MJ>Буду благодарен за любую помощь.
всмысле какая именно программа интересует? Тут для разных приложений и операционисток разные типы способов.
Q>можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?
MJ>>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот). MJ>>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.
MJ>>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования. MJ>>Буду благодарен за любую помощь.
Здравствуйте, Qa1888, Вы писали:
Q>всмысле какая именно программа интересует? Тут для разных приложений и операционисток разные типы способов.
Q>>можно, вот моя http://formatscustomizer.com такое делает. Вас все приложения интересуют, или какое то конкретное?
MJ>>>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот). MJ>>>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.
MJ>>>Я по этой теме нашёл OFNHookProc, но не нашёл примеры её использования. MJ>>>Буду благодарен за любую помощь.
Вот эта программа http://upload.com.ua/get/901860506/.
Это программа для работы с GPS логгером.
А именно интересует диалог "Экспорт треков".
Нужно перехватить имя файла и путь,когда пользователь нажмёт на кнопку "сохранить".
"Экспорт треков" команда не активна, не могу увидеть. Но там была "сохранить проект", думаю что в экспорте тем же образом реализовано
Короче? тут судя по всему используется функция GetSaveFileNameW. Вам повезло, в висте и семерке она тоже, сужу по тому что диалог выглядит так же как и в xp.
Дело в том что диалог сохранения в виста/7 у многих прог другой, есть механизм вызова выбора файла через ком. Обычно это все скрыто оболочками типа CFileDialog и аналогичными. А вот тогда было бы много гемора с выбором.
Тут вам надо перехватить функцию GetSaveFileNameW, пропатчите. После вызова оригинала смотрите че функция вернула, если не 0, то в структуре LPOPENFILENAME
сможете найти путь. И отослать уже вашему приложению данные.
Это первый путь. Второй что при выборе и нажатии ок, отсылается CDN_FILEOK notification. В msdn можете подробности найти. Там же написано что это не для всех диалогов,
а только которые созданы используя OFN_EXPLORER. Таков ли этот диалог надо проверять.
MJ>Нужно перехватить сообщение стандартного диалога сохранения файла в ДРУГОЙ программе. Перехватить надо диалог вызваный из определённой(а не любой) программы (на пример диалог "Сохранить как" в программе Блокнот). MJ>Нужно по нажатию кнопки "Сохранить" получить из этого диалога путь и имя файла, при этом сохранение во внешней программе должно продолжится.
Не уверен, что это самый простой способ, но он 100% рабочий.
Устанавливаете системный хук на WH_CALLWNDPROCRET. В нужный процесс загружаете свою dll.
В WH_CALLWNDPROCRET WM_INITDIALOG отлавливаете нужное окно через просмотр контролов — диалог сохранения. Теперь ваш код выполняется внутри нужного процесса и у вас есть хендл нужного окна.
Отлавливаете закрытие диалога по WM_DESTROY. Проверяете, что не было нажато Cancel.
Получаете у диалога выбранный пользователем путь — задача нетривиальная , но есть готовые решения через WM_GETISHELLBROWSER или CDM_GETFOLDERIDLIST.
Здравствуйте, 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 на место