Internet Explorer中打开新的模态对话框窗口时引发的事件

本文关键字:窗口 事件 对话框 模态 Internet Explorer | 更新日期: 2023-09-27 18:16:49

我使用SHDocVw。InternetExplorer的api在我的Vb。. Net WinForms应用程序来捕获从IE发送的请求。

链接

" NewWindow3事件只在一个新的Internet实例被触发即将创建资源管理器。调用showModalDialog或showModelessDialog不会触发事件,因为它们不是新的Internet Explorer的实例"

我正在尝试在Internet Explorer中自动执行用户操作以进行自动测试。所以我想知道,由于一些用户操作,一个模态对话框被打开或一些警告窗口被打开。

我的问题是:

  • 我怎么知道在Internet Explorer中打开了一个模态对话框窗口?

  • 在这种情况下,ie是否会引发其他事件?

  • 如果不可能直接处理,那么是否有其他方法来处理这种情况?

Internet Explorer中打开新的模态对话框窗口时引发的事件

我唯一能找到的是WindowStateChanged事件http://msdn.microsoft.com/en-us/library/aa768307(v=vs.85).aspx,其中提到:

当一个内容的状态窗口(如浏览器窗口或选项卡)可能已更改。的以下操作将引发此事件。

  • 浏览器窗口最小化或恢复。
  • 活动选项卡变为非活动选项卡。
  • 不活动的选项卡变为活动的。
  • 浏览器窗口由于一个模态对话框而被启用或禁用

这是一个VB。. NET代码示例如何使用WindowStateChanged事件来检查启用/禁用和可见标志:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Code to instantiate the IE COM object'
        Dim IE As New SHDocVw.InternetExplorer()
        AddHandler IE.WindowStateChanged, AddressOf OnWindowStateChanged
        'do stuff here'
        IE.Quit()
    End Sub
    Public Sub OnWindowStateChanged(ByVal dwWindowStateFlags As UInteger, ByVal dwValidFlagsMask As UInteger)
        Const OLECMDIDF_WINDOWSTATE_USERVISIBLE As UInteger = 1
        Const OLECMDIDF_WINDOWSTATE_ENABLED As UInteger = 2
        'Check if the window is disabled'
        If dwValidFlagsMask And OLECMDIDF_WINDOWSTATE_ENABLED = OLECMDIDF_WINDOWSTATE_ENABLED Then
            If dwWindowStateFlags And OLECMDIDF_WINDOWSTATE_ENABLED <> OLECMDIDF_WINDOWSTATE_ENABLED Then
                'The browser window has been disabled.... possibly by a modal popup'
            Else
                'The browser is enabled.'
            End If
        Else
            'The enabled/disabled flag has not been initialized, so we cannot check the state during this event handler execution'
        End If
        'Check if window is visible: '
        If dwValidFlagsMask And OLECMDIDF_WINDOWSTATE_USERVISIBLE = OLECMDIDF_WINDOWSTATE_USERVISIBLE Then
            If dwWindowStateFlags And OLECMDIDF_WINDOWSTATE_USERVISIBLE <> OLECMDIDF_WINDOWSTATE_USERVISIBLE Then
                'The browser window is NOT visible'
            Else
                'The browser window is visible'
            End If
        Else
            'The visible flag has not been initialized, so we cannot check the state during this event handler execution'
        End If
    End Sub
End Class

您正在寻找的事件可能不存在,但是有许多方法可以检测模式是否打开。

你可以使用jquery来添加/删除模态上的类:我可以检查是否Bootstrap模态显示/隐藏?

你可以检查控制台:检查如果jquery显示模式是活跃的,做点什么

我不推荐控制台方法,当控制台不打开时,会有更多的事情发生。

我可以想到几种方法来解决你的问题,而不关心的事件在所有然而,不能模态对话的IE页面,然后使用API与您的应用程序?你可以使用show() &Hide()来改变模态的状态,当状态改变时触发额外的代码来做你需要做的事情。

另一种选择是将值保存到数据库并在应用程序中读取它们(显然不需要API)。

如果这些听起来都不好,也许你应该确切地告诉我们你想从功能的角度完成什么,我们将能够构建/给你一个解决方案。

没有这样的事件,但您可以使用其他方法:

  1. Webbrowser.Document.Window。在模态窗口将之前触发错误
  2. 你可以实现INewWindowManager接口-我不知道确切的,但我认为它可以给你一些信息

  3. 你可以实现IDocHostUIHandler和使用ShowUI方法-但它执行的不仅仅是显示新窗口,你应该使用它仔细

  4. iolecommand - '执行'方法与cmdIdOlecmdid_showscripterror, olecmdid_showmessage, olecmdid_showfind,OLECMDID_SHOWPAGESETUP, OLECMDID_SHOWPRINT表示新窗口将被打开