Как обрабатывать окна сообщений при использовании веб-браузера в C #? - PullRequest
4 голосов
/ 19 марта 2012

Я использую эту функцию веб-браузера в C #.Пытаюсь зайти на сайт через мое приложение.Все идет хорошо, за исключением того, что при вводе неверного идентификатора или пароля появляется небольшое окно сообщения (которое установлено на самой веб-странице), которое всплывает и блокирует все, пока не будет нажата кнопка «ОК».Вопрос в том, есть ли какой-нибудь возможный способ управления этим маленьким окном (например, чтение текста внутри него)?Если это так здорово!Но если нет никакого способа сделать это, тогда есть ли способ просто заставить это окно сообщения исчезнуть программно?

Ответы [ 3 ]

8 голосов
/ 19 марта 2012

Вы можете «управлять» диалоговым окном сообщения, импортировав некоторые оконные функции из user32.dll и получив дескриптор диалогового окна сообщения по имени класса и имени окна.Например, чтобы нажать кнопку «ОК»:

public class Foo
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);


    private void ClickOKButton()
    {
        IntPtr hwnd = FindWindow("#32770", "Message from webpage");
        hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
        uint message = 0xf5;
        SendMessage(hwnd, message, IntPtr.Zero, IntPtr.Zero);
    }
}

Некоторые материалы для чтения из MSDN .

2 голосов
/ 19 марта 2012

Копировать пасту из Sires anwser: https://stackoverflow.com/a/251524/954225

private void InjectAlertBlocker() {
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    string alertBlocker = "window.alert = function () { }";
    element.text = alertBlocker;
    head.AppendChild(scriptEl);
}
0 голосов
/ 22 апреля 2019

вот уточненная версия ответа Саэба.Код Саэба у меня не работал, я добавил еще один шаг, чтобы активировать кнопку, а затем щелкнул по ней.

using System;
using System.Runtime.InteropServices;

namespace IE_Automation
{
public class IEPoppupWindowClicker
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
    private const int BM_CLICK = 0xF5;
    private const uint WM_ACTIVATE = 0x6;
    private const int WA_ACTIVE = 1;

    public void ActivateAndClickOkButton()
    {
        // find dialog window with titlebar text of "Message from webpage"

        var hwnd = FindWindow("#32770", "Message from webpage");
        if (hwnd != IntPtr.Zero)
        {
            // find button on dialog window: classname = "Button", text = "OK"
            var btn = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
            if (btn != IntPtr.Zero)
            {
                // activate the button on dialog first or it may not acknowledge a click msg on first try
                SendMessage(btn, WM_ACTIVATE, WA_ACTIVE, 0);
                // send button a click message

                SendMessage(btn, BM_CLICK, 0, 0);
            }
            else
            {
                //Interaction.MsgBox("button not found!");
            }
        }
        else
        {
            //Interaction.MsgBox("window not found!");
        }

    }
}
}
...