none
使用SHDocVW.ShellWindows获取页面数也实际显示不一致的问题 RRS feed

  • 问题


  • 我想用SHDocVW.ShellWindows对IE进行监控,发现一个无法解决的现象,打开IE后转跳到页面A,可以获取到A页面。

    但是在A页面地址栏输入页面B,转跳后,代码里会同时获取到A页面和B页面。

    我有办法确定我获取到的页面里哪个是当前显示的页面吗?

    ShellWindows shellwin=new ShellWIndows();
    foreach(InternetExplorer broswer in shellwin)
    {
        if(broswer.Name.Contains("Internet Explorer"))
        // 此时IE显示只有页面B,但是控制台会输出页面A与B的名字
            Console.WriteLine(browser.LocationName);
    }
    

    InternetExplorer实现了IWebBrowser32的接口,可以获取到Busy和ReadState属性。

    在上面的例子中,看不见的页面A会变成Busy=True,ReadState=Loading的情况

    而在IE实际显示的页面B则Busy=False,ReadState=Complete

    这也和我的直觉相反,不过这两个属性可以帮助我判断到底哪个页面是显示的页面吗?

    2018年10月23日 9:47

全部回复

  • 你好,

    >>这也和我的直觉相反,不过这两个属性可以帮助我判断到底哪个页面是显示的页面吗?

    这只是InternetExplorer对象的状态,根据那个值来判断都会出现问题, 你可以试试通过进程的方式来尝试一下,下面的代码你参考一下:先要引用 UIAutomationClient

    static void Main(string[] args)
            {
                foreach (Process process in Process.GetProcessesByName("iexplore"))
                {
                    string url = GetInternetExplorerUrl(process);
                    if (url == null)
                        continue;
    
                    Console.WriteLine("IE Url for '" + process.MainWindowTitle + "' is " + url);
                }
    
                Console.ReadLine();
            }
    
    
            public static string GetInternetExplorerUrl(Process process)
            {
                if (process == null)
                    throw new ArgumentNullException("process");
    
                if (process.MainWindowHandle == IntPtr.Zero)
                    return null;
    
                AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle);
                if (element == null)
                    return null;
    
                AutomationElement rebar = element.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "ReBarWindow32"));
                if (rebar == null)
                    return null;
    
                AutomationElement edit = rebar.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
    
                return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
            }

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年10月24日 8:18
    版主