Нажмите сохраняют кнопку “Диалогового окна загрузки файла” Internet Explorer через c#

Я работаю над автоматизацией 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

5
задан Peter O. 2 December 2012 в 06:20
поделиться

2 ответа

ну, вам нужно найти окно с заголовком 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;)

1
ответ дан 14 December 2019 в 08:42
поделиться

Попробуйте следующее, которое, как мне показалось, сработало:

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");

Я бы посоветовал вам проверить результаты каждой функции.

2
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: