Frage

Ich versuche zur Zeit eine einfache Komponente zu bauen, die überwachen sollen, wenn der Benutzer ein Fenster mit einer bestimmten URL öffnet (nur IE). Also schrieb ich diese Komponente und alles funktioniert, so dass ich integrierte sie mit der Anwendung, wo es nötig war. Das Problem ist, in dieser Anwendung Performancecounters verwendet werden, und diese scheinen das Verhalten des Internetexplorer-Automatisierungsobjekts zu stören.

Also schrieb ich diese kleine Probe, das Problem zu demonstrieren:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Diagnostics;
using SHDocVw;

namespace IEHookTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(PerfCounter);
            t.Start();

            URLInterceptor.Instance.StartListening();
            Console.ReadLine();
        }

        private static void PerfCounter()
        {
            PerformanceCounter cpuPc = 
                new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
            do
            {
                float x = cpuPc.NextValue();
                System.Diagnostics.Debug.WriteLine(x);
                Thread.Sleep(50);
            } while (true);
        }
    }

    class URLInterceptor
    {
        private const string DEMANDED_URL = "test";
        private ShellWindows _shellWindows = new ShellWindows();

        public static readonly URLInterceptor Instance = new URLInterceptor();
        private static int _count = 0;
        private URLInterceptor()
        {
        }

        public void StartListening()
        {
            _count++;
            _shellWindows.WindowRegistered -= ShellWindows_WindowRegistered;
            _shellWindows.WindowRegistered += new DShellWindowsEvents_WindowRegisteredEventHandler(ShellWindows_WindowRegistered);
            FindIEs();
        }

        private void FindIEs()
        {
            int count = 0;
            foreach (InternetExplorer browser in _shellWindows)
            {
                browser.NewWindow3 -= browser_NewWindow3;
                browser.NewWindow3 += new DWebBrowserEvents2_NewWindow3EventHandler(browser_NewWindow3);
                count++;
            }
        }

        private void ShellWindows_WindowRegistered(int lCookie)
        {
            FindIEs();
        }

        private void browser_NewWindow3(ref object ppDisp,
                                        ref bool Cancel,
                                        uint dwFlags,
                                        string bstrUrlContext,
                                        string bstrUrl)
        {
            if (!string.IsNullOrEmpty(bstrUrl) && bstrUrl.ToLower().Contains(DEMANDED_URL))
            {
                Cancel = true;
                Console.WriteLine("catched URL: " + bstrUrl);
            }
        }
    }
}

Diese Probe muss einen Verweis auf die "Microsoft Internet Controls" (SHDocVw). Um die Probe zu testen, öffnen Sie einfach Google und die Suche nach „test“. Nehmen Sie die erste Verbindung und öffnen Sie sie in einem neuen Tab oder Fenster. Sie werden sehen, dass manchmal das „NewWindow3“ Ereignis ausgelöst wird, und manchmal ist es nicht. Aber wenn Sie einen Kommentar aus der Leitung 15 (Thread-Start), arbeiten die Objekte wie erwartet, und heben das Ereignis für jedes neues Fenster.

Also meine Frage ist, warum ist der Leistungsindikator das Internet Explorer-Objekt zu stören, und wie kann ich beides. Ich versuchte, die Überwachungskomponente in einem neuen AppDomain zu laufen, aber das hat nicht das Problem zu lösen. Nur ein neuer Prozess eine Lösung zu schaffen, aber das ist will ich will nicht zu tun, aus mehreren Gründen.

Ich teste auf Win2k3 Server mit IE 7.

War es hilfreich?

Lösung

Um die Referenzen zu halten in einem Arraylist das Problem löst. Es scheint, dass die Shellwindows-Sammlung nicht die Verweise halten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top