簡體   English   中英

使用SHDocVw鈎住IE選項卡

[英]Hook IE tabs with SHDocVw

我正在嘗試跟蹤IE訪問哪些網站。 我正在使用SHDocVw.dll。

到目前為止,我已經能夠鈎住IE的新實例(當用戶打開IE的新窗口時)。 但是,如果用戶在窗口中打開一個標簽,則無法鈎住該標簽。

private static SHDocVw.InternetExplorer browser;
private static SHDocVw.ShellWindows shellWindows;
private static ArrayList Current_IE_Handles;

static void Main(string[] args)
{
    Current_IE_Handles=new ArrayList();
    shellWindows = new SHDocVw.ShellWindowsClass();
    shellWindows.WindowRegistered+=new SHDocVw.DShellWindowsEvents_WindowRegisteredEventHandler(shellWindows_WindowRegistered);
    shellWindows.WindowRevoked+=new SHDocVw.DShellWindowsEvents_WindowRevokedEventHandler(shellWindows_WindowRevoked);
}

// THIS EVENT IS FIRED WHEN THE BROWSER IS JUST ABOUT THE NAVIGATE TO A WEBSITE
private static void browser_BeforeNavigate2(object a,ref object b,ref object c,ref object d,ref object e,ref object f,ref bool g)
{
    try
    {
        bool adbar = (bool)a.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, a, null);

        if (adbar)
            Console.WriteLine(b);
    }
    catch (Exception)
    {

    }
}

// THIS EVENT IS FIRED WHEN A BROWSER IS CLOSED
private static void shellWindows_WindowRevoked(int z)
{
    string filnam;
    ArrayList Closed_IE=new ArrayList();

    foreach (SHDocVw.InternetExplorer ie in shellWindows)
    {
        filnam = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

        if (filnam.Equals("iexplore"))
            Closed_IE.Add(ie.HWND);
    }

    foreach (int hwnd in Current_IE_Handles)
    {
        if (!Closed_IE.Contains(hwnd))
        {
            Console.WriteLine("Browser Closed : Handle( " + hwnd.ToString("X4") + " )");
            Current_IE_Handles.Remove(hwnd);
            break;
        }
    }
}

// THIS EVENT IS FIRED WHEN A NEW BROWSER IS OPENED
private static void shellWindows_WindowRegistered(int z)
{
    string filnam;
    foreach (SHDocVw.InternetExplorer ie in shellWindows)
    {
        filnam = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

        if (filnam.Equals("iexplore"))
        {
            if (!Current_IE_Handles.Contains(ie.HWND))
            {
                Current_IE_Handles.Add(ie.HWND);
                Console.WriteLine("Browser Open : Handle( " + ie.HWND.ToString("X4") + " )");
                //ie.BeforeNavigate2 += new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(browser_BeforeNavigate2);
                ie.NavigateComplete2 += browser_NavigateComplete2;
            }
        }
    }
}

static void browser_NavigateComplete2(object pDisp, ref object URL)
{
    try
    {
        bool adbar = (bool)pDisp.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, pDisp, null);

        if (adbar)
            Console.WriteLine(URL);
    }
    catch (Exception)
    {

    }
}

經過大量的反復試驗,我提出了一個解決方案。 盡管我不確定效果如何。 但這有效。 發布它以防其他人需要類似的東西。

private static List<IEContainer> Current_IEs;
private static SHDocVw.ShellWindows shellWindows;

static void Main(string[] args)
{
    Current_IEs = new List<IEContainer>();
    shellWindows = new SHDocVw.ShellWindowsClass();
    shellWindows.WindowRegistered+=new SHDocVw.DShellWindowsEvents_WindowRegisteredEventHandler(shellWindows_WindowRegistered);
    shellWindows.WindowRevoked+=new SHDocVw.DShellWindowsEvents_WindowRevokedEventHandler(shellWindows_WindowRevoked);

    while (true)
        Console.ReadLine();
}

// THIS EVENT IS FIRED WHEN THE A NEW BROWSER IS CLOSED
private static void shellWindows_WindowRevoked(int z)
{
    if (Current_IEs.Exists(x => x.Cookie == z))
    {
        Console.WriteLine("Browser close: " + z);
        Current_IEs.Remove(Current_IEs.Find(x => x.Cookie == z));
    }
}

// THIS EVENT IS FIRED WHEN THE A NEW BROWSER IS OPEN
private static void shellWindows_WindowRegistered(int z)
{
    string filnam;

    foreach (SHDocVw.InternetExplorer ie in shellWindows)
    {
        filnam = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

        if (filnam.Equals("iexplore"))
        {
            if (!Current_IEs.Exists(x => x.IE == ie))
            {
                try
                {
                    bool adbar = (bool)ie.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, ie, null);

                    if (adbar)
                    {
                        Current_IEs.Add(new IEContainer { Cookie = z, IE = ie });
                        Console.WriteLine("Browser open: " + z);
                        ie.NavigateComplete2 += browser_NavigateComplete2;
                    }
                }
                catch (Exception)
                {

                }
            }
        }
    }
}

static void browser_NavigateComplete2(object pDisp, ref object URL)
{
    try
    {
        bool adbar = (bool)pDisp.GetType().InvokeMember("AddressBar", System.Reflection.BindingFlags.GetProperty, null, pDisp, null);

        if (adbar)
            Console.WriteLine(URL);
    }
    catch (Exception)
    {

    }
}

class IEContainer
{
    public int Cookie { get; set; }
    public SHDocVw.InternetExplorer IE { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM