在Internet Explorer中打开新的模式对话框窗口时会引发哪个事件?

时间:2014-08-07 07:02:17

标签: c# vb.net internet-explorer

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

this链接

上给出
  

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

的实例

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

所以我的问题是:

  • 我如何知道在Internet Explorer中打开模式对话框窗口?

  • 在这种情况下,Internet Explorer是否还有其他事件?

  • 如果不能直接处理这种情况会有其他方法吗?

3 个答案:

答案 0 :(得分:1)

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

  

当内容的状态时引发WindowStateChanged事件   窗口(例如浏览器窗口或选项卡)可能已更改。该   以下行动引发了这一事件。

     
      
  • 最小化或恢复浏览器窗口。
  •   
  • 活动标签变为无效。
  •   
  • 非活动标签变为活动状态。
  •   
  • 由于模式对话框,启用或禁用了浏览器窗口。
  •   

这是一个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

答案 1 :(得分:1)

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

您可以使用jquery在模态上添加/删除类:Can I check if Bootstrap Modal Shown / Hidden?

您可以查看控制台:check if jquery reveal modal is active, do something

我不建议使用控制台方法,还有更多的内容,例如控制台未打开时。

我可以想到几种方法来解决你的问题而不关心事件,但是,模式是否可以与IE页面对话,然后使用API​​与你的应用交谈?你可以使用show()&amp; hide()改变模态的状态,并在该状态改变时触发附加代码以执行您需要的操作。

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

如果这些听起来都不好,或许您应该从功能的角度准确地告诉我们您要完成的任务,我们将能够构建/给您一个解决方案。

答案 2 :(得分:0)

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

  1. Webbrowser.Document.Window.Error在模态窗口之前触发 显示
  2. 您可以实现INewWindowManager界面 - 我不确切知道,但我认为它可以为您提供一些信息

  3. 你可以实现IDocHostUIHandler并使用ShowUI方法 - 但它不仅用于显示新窗口,你应该使用它

  4. IOleCommandTarget - &#39; Exec&#39; cmdId的方法 OLECMDID_SHOWSCRIPTERROR,OLECMDID_SHOWMESSAGE,OLECMDID_SHOWFIND,     OLECMDID_SHOWPAGESETUP,OLECMDID_SHOWPRINT表示新窗口     将被打开