Я работаю над автоматизацией Internet Explorer, и часть ее включает файлы загрузки от сайта, который размещается на asp 2.0 и использует аутентификацию на основе форм, так для создания вплотную автоматизации, я использовал автоматизацию браузера.
Я смог достигнуть к шагу, где я могу добраться для нажатия на URL, который приносит "диалоговое окно" Загрузки Файла браузера, затем я пытался использовать SendKeys для нажатия на кнопку сохранения, но напрасно это не работало.
Вот код, где я использую метод FindWindow для получения hWnd указателя Диалогового окна Загрузки Файла, и затем использующий setActiveWindow я делаю это активным окном так, чтобы SendKeys управлял работами над ним и затем использованием SendKeys, который я пытался отправить Высокому звуку + S, но это не работало. Я заметил, что, Вкладка, Escape и Вводит работы, но затем Вводит в кнопку Save, не работает.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
private void Form1_Load(object sender, EventArgs e)
{
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr nullptr = (IntPtr)0;
if (hwnd != nullptr)
{
SetActiveWindow(hwnd);
SendKeys.SendWait("%S");
}
}
С помощью того же кода я смог получить доступ к блокноту путем изменения значения в FindWindow к "Без названия - Блокнот".
Я должен сделать что-то другое, поскольку это - диалоговое окно и теперь окно? Я использую IE8.
Это - альтернативный код, который я попробовал после ответа.
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr hokBtn = IntPtr.Zero;
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
hokBtn = FindWindowEx(hwnd, hokBtn, "Button", IntPtr.Zero);
uint id = GetDlgCtrlID(hokBtn);
SetActiveWindow(hwnd);
IntPtr res = SendMessage(hokBtn, (int)0x00F5, 0, IntPtr.Zero);
if (res.ToInt32() == 1)
MessageBox.Show("success");
Для ясности я добавляю экран диалогового окна.
сопроводительный текст http://www.freeimagehosting.net/uploads/4f23586401.png
ну, вам нужно найти окно с заголовком downloading dialog. а потом найти окно с заголовком download button/ и послать этому окну click message
BM_CLICK = 0x00F5
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr next, string sClassName, IntPtr sWindowTitle);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern uint GetDlgCtrlID(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
//hDialog - handle of dialog window. idBtn - Id of button
public static bool ClickButtonOnDialog(IntPtr hDialog, UInt32 idBtn)
{
IntPtr res = IntPtr.Zero;
uint id;
IntPtr hOkBtn = IntPtr.Zero;
int attempt = 0;
do
{
Thread.Sleep(300);
//searching for button
hOkBtn = User32.FindWindowEx(hDialog, hOkBtn, "Button", IntPtr.Zero);
id = User32.GetDlgCtrlID(hOkBtn);
attempt++;
} while (id != idBtn && attempt < 20);
if (!hOkBtn.Equals(IntPtr.Zero))
{
//click the button
res = User32.SendMessage(hOkBtn, (int)WindowsMessages.BM_CLICK, 1, IntPtr.Zero);
}
if (res.ToInt32() == 1)
return true;
return false;
}
и вы можете использовать winspector (аналог spy++). это очень полезная утилита. Вы можете узнать много нового о windows;)
Попробуйте следующее, которое, как мне показалось, сработало:
IntPtr hwnd = FindWindow(null, "File Download");
IntPtr hokBtn = FindWindowEx(hwnd, null, "Button", "Cancel");
uint id = GetDlgCtrlID(hokBtn);
SetActiveWindow(hwnd);
IntPtr res = SendMessage(hokBtn, (int)0x00F5, 0, IntPtr.Zero);
if (res.ToInt32() == 1)
MessageBox.Show("success");
Я бы посоветовал вам проверить результаты каждой функции.