Проблема обработки окна hwnd при сохранении файла в разных местах

Новое в окнах форм/дескриптор окна.

Пытаюсь сохранить файлы в разных местах.

Изображение диалогового окна сохранения файла:

введите здесь описание изображения

Я могу получить дескриптор поля редактирования полей редактирования имени файла в диалоговом окне сохранения файла. Возможность вставить путь.

введите здесь описание изображения

private const int WM_SETTEXT = 0x000C;

IntPtr edithWnd = IntPtr.Zero;
edithWnd = FindWindowEx(edithWnd, IntPtr.Zero, "Edit", null);
SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, "D:\Mine\Folder1\file");

Приведенный выше код устанавливает путь к файлу в текстовом поле имени файла.

Теперь нажмите кнопку «Сохранить», получив ее дескриптор и отправив щелчок.

private const int BM_CLICK = 0x00F5;

IntPtr handle = GetForegroundWindow(); // Save As dialog
IntPtr edithWnd = FindWindowEx(handle, IntPtr.Zero, "Button", "&Save");           
SendMessage(edithWnd, BM_CLICK, IntPtr.Zero, null);

Он работает нормально, но при использовании этого кода в цикле для сохранения нескольких файлов в разных местах он работает неправильно, он сохраняет все файлы только в одном месте.

Например, файл сохраняется в D:\Mine\Folder1\file

file1 не сохраняется в D:\Mine\Folder2\file1, а сохраняется в D:\Mine\Folder1\file1

файл2 не сохраняется в D:\Mine\Folder3\file2, а сохраняется в D:\Mine\Folder1\file2

Похоже, он указывает только на первое место, независимо от пути.


person Baj B    schedule 24.08.2020    source источник
comment
вы, кажется, показываете части своего кода, которые работают, как ожидалось, а затем продолжаете описывать часть с циклом, который не работает —> включите этот код. приложение, в котором размещен этот диалог сохранения, находится под вашим контролем, или вы автоматизируете другое приложение?   -  person Cee McSharpface    schedule 24.08.2020
comment
У меня есть файлы в одном из мест..... Я программно открываю эти файлы и снова сохраняю их в разных местах и ​​закрываю файл, поэтому зацикливаю все доступные файлы в этом месте..... Мне просто нужна причина почему это не работает или что-то еще, что мне нужно сделать, чтобы оно работало программно, потому что, делая это вручную, оно сохраняет файлы в нужных папках   -  person Baj B    schedule 24.08.2020
comment
связанный: stackoverflow.com/q/34735332/1132334 вызов кадра: используйте другой подход для перемещения файлов. это все равно может сломаться с более новыми версиями Windows.   -  person Cee McSharpface    schedule 24.08.2020
comment
SaveFileDialog имеет такие свойства, как FileName, которые позволяют вам устанавливать эти значения, почему вместо этого вы пытаетесь использовать собственные API Windows?   -  person Ian Kemp    schedule 24.08.2020
comment
Лан Кемп, я думаю, что SaveFileDialog будет открыт, если щелкнуть пункт меню «Сохранить как», согласно комментарию OP, поэтому мы не можем установить его раньше, верно? поскольку мы не создаем экземпляр SaveFileDialog здесь, SaveFileDialog будет открыт по щелчку, и OP обращается к нему через дескриптор окна   -  person Jay    schedule 24.08.2020


Ответы (1)


Почему бы не попасть сначала в нужный путь, а потом сохранить файл.

Работал на меня..

SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, "D:\Mine\Folder1\");
// Hit enter
SendKeys.SendWait("{ENTER}");
// Now click the save button, file name will be there already, in case if it is 
// not paste the file name first and then perform save button click

Возможно, вам придется сфокусировать путь к файлу, прежде чем нажимать Enter, который установит фокус, а нажатие Enter позволит вам войти в путь к папке.

person Jay    schedule 25.08.2020
comment
Да, этот подход полезен в моем случае .... Я могу сначала войти в папку, а затем сохранить файл ... Большое спасибо. - person Baj B; 25.08.2020