Results 1 to 4 of 4

Thread: C# Internet Explorer DOM using ObjectFromLresult.

  1. #1

    Thread Starter
    Frenzied Member dynamic_sysop's Avatar
    Join Date
    Jun 2003
    Location
    Ashby, Leicestershire.
    Posts
    1,142

    C# Internet Explorer DOM using ObjectFromLresult.

    Howdo, I've been working on this for a couple of days, I did a VB.NET example of this on a forum a few years ago, but C# presented me with a new challenge & it took a while to figure out.

    The Idea is to get hold of an open instance of IE ( IE7 in this case ) & grab hold of it's IHTMLDocument2 Interface, giving the ability to manipulate that external Internet Explorer window / grab it's url address, it's html, make it navigate elsewhere, etc...

    when this code is added to a project, you must make a reference to Microsoft.mshtml
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;
    using mshtml;
    
    namespace HookBrowser
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            #region API CALLS
    
            [DllImport("user32.dll", EntryPoint = "GetClassNameA")]
            public static extern int GetClassName(IntPtr hwnd, StringBuilder lpClassName, int nMaxCount);
    
            /*delegate to handle EnumChildWindows*/
            public delegate int EnumProc(IntPtr hWnd, ref IntPtr lParam);
    
            [DllImport("user32.dll")]
            public static extern int EnumChildWindows(IntPtr hWndParent, EnumProc lpEnumFunc, ref  IntPtr lParam);
            [DllImport("user32.dll", EntryPoint = "RegisterWindowMessageA")]
            public static extern int RegisterWindowMessage(string lpString);
            [DllImport("user32.dll", EntryPoint = "SendMessageTimeoutA")]
            public static extern int SendMessageTimeout(IntPtr hwnd, int msg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult);
            [DllImport("OLEACC.dll")]
            public static extern int ObjectFromLresult(int lResult, ref Guid riid, int wParam, ref IHTMLDocument2 ppvObject);
            public const int SMTO_ABORTIFHUNG = 0x2;
            public Guid IID_IHTMLDocument = new Guid("626FC520-A41E-11CF-A731-00A0C9082637");
    
            #endregion
    
            public IHTMLDocument2 document;
    
            private void button1_Click(object sender, EventArgs e)
            {
                document = documentFromDOM();
                /// check that we have hold of the IHTMLDocument2...
                if (!(bool)(document == null))
                {
                    this.Text = document.url;
                }
            }
    
            private IHTMLDocument2 documentFromDOM()
            {
                Process[] processes = Process.GetProcessesByName("iexplore");
                if (processes.Length > 0)
                {
                    IntPtr hWnd = processes[0].MainWindowHandle;
                    int lngMsg = 0;
                    int lRes;
    
                    EnumProc proc = new EnumProc(EnumWindows);
                    EnumChildWindows(hWnd, proc, ref hWnd);
                    if (!hWnd.Equals(IntPtr.Zero))
                    {
                        lngMsg = RegisterWindowMessage("WM_HTML_GETOBJECT");
                        if (lngMsg != 0)
                        {
                            SendMessageTimeout(hWnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, out lRes);
                            if (!(bool)(lRes == 0))
                            {
                                int hr = ObjectFromLresult(lRes, ref IID_IHTMLDocument, 0, ref document);
                                if ((bool)(document == null))
                                {
                                    MessageBox.Show("No IHTMLDocument Found!", "Warning");
                                }
                            }
                        }
                    }
                }
                return document;
            }
    
            private int EnumWindows(IntPtr hWnd, ref IntPtr lParam)
            {
                int retVal = 1;
                StringBuilder classname = new StringBuilder(128);
                GetClassName(hWnd, classname, classname.Capacity);
                /// check if the instance we have found is Internet Explorer_Server
                if ((bool)(string.Compare(classname.ToString(), "Internet Explorer_Server") == 0))
                {
                    lParam = hWnd;
                    retVal = 0;
                }
                return retVal;
            }
        }
    }
    ~
    if a post is resolved, please mark it as [Resolved]
    protected string get_Signature(){return Censored;}
    [vbcode][php] please use code tags when posting any code [/php][/vbcode]

  2. #2
    New Member
    Join Date
    May 2008
    Posts
    1

    Thumbs up Re: C# Internet Explorer DOM using ObjectFromLresult.

    Just what i'm looking for, Thank you !
    But I have an answer, does it work with previous IE release? (like 5 or 6)
    Thanks

  3. #3

    Thread Starter
    Frenzied Member dynamic_sysop's Avatar
    Join Date
    Jun 2003
    Location
    Ashby, Leicestershire.
    Posts
    1,142

    Re: C# Internet Explorer DOM using ObjectFromLresult.

    should work with IE6, i wouldn't know about IE5 as i haven't tried, do people still use IE5?
    ~
    if a post is resolved, please mark it as [Resolved]
    protected string get_Signature(){return Censored;}
    [vbcode][php] please use code tags when posting any code [/php][/vbcode]

  4. #4
    New Member
    Join Date
    Feb 2015
    Posts
    9

    Re: C# Internet Explorer DOM using ObjectFromLresult.

    This could be usefull to me, I've had (for me) an interesting idea for a function to add to a program I'm writting in C#, (noob project). I've started writting a membership program where the address information is often flawed, because of bad handwritting or mistyping.

    What I'd like to try and code is something where the postcode/zipcode is typed into a box and an instance of internet explorer opens and retrieves the details.

    I know I can type the address postcode into google and it gives a lot of hits with varying degrees of accuracy, but is there a database open to public interogation for this type of purpose?

    Any help would be appeciated and if successfull, I would post the code in the codebank for other users to evaluate and comment on.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width