HTMLDocumentEvents2,событие onclick - неправильная обработка
От: SinBad Беларусь  
Дата: 05.02.08 17:17
Оценка:
Всем доброго времени суток.

Помогите пожалуйста разобраться с проблемой:
я пишу плагин к IE,
и когда я регистрирую обработчик на событие onclick, то со страницей(например www.google.com) творится что-то станное,
я не могу вводит символы в поисковую сторку, вообще курсор туда попадет только по правому нажатию мыши.
Такая же проблема и с другими событиями onkeypress, onmousedown и т.д., но не совсеми(onfocusin, onfocusout).

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;


namespace PluginIE
{

    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
    public interface IObjectWithSite
    {
        [PreserveSig]
        int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
        [PreserveSig]
        int GetSite(ref Guid guid, out IntPtr ppvSite);
    }


    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    [Guid("C59EB780-B556-4b38-A20D-D666E4B081E2")]
    [ProgIdAttribute("PluginIE.SampleBHO")]
    public class SampleBHO : IObjectWithSite
    {
        public const string GUID = "C59EB780-B556-4b38-A20D-D666E4B081E2";
        
        private SHDocVw.WebBrowser webBrowser = null;
        private mshtml.HTMLDocument doc = null;
        private mshtml.HTMLDocumentEvents2_Event iEvent = null;

        public int SetSite(object pUnkSite)
        {
            if (pUnkSite != null)
            {
                webBrowser = (SHDocVw.WebBrowser)pUnkSite;  // set the reference

                if (webBrowser != null && webBrowser.FullName.Contains("Internet Explorer"))
                {
                    webBrowser.PutProperty("BHO", this);
                    webBrowser.DocumentComplete += new SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
                }
            }
            else
            {
                if (webBrowser != null)
                {
                    webBrowser = null;
                }
            }

            return 0;
        }

        public int GetSite(ref Guid riid, out IntPtr ppvSite)
        {
            ppvSite = System.IntPtr.Zero;
            if (webBrowser != null)
            {
                IntPtr pSite = IntPtr.Zero;
                IntPtr pUnk = Marshal.GetIUnknownForObject(webBrowser);
                Marshal.QueryInterface(pUnk, ref riid, out pSite);

                Marshal.Release(pUnk);
                if (!pSite.Equals(IntPtr.Zero))
                {
                    ppvSite = pSite;
                }
                else
                {
                    webBrowser = null;
                    //Marshal.ThrowExceptionForHR(E_NOINTERFACE);
                }
            }
            else
            {
                webBrowser = null;
                //Marshal.ThrowExceptionForHR(E_FAIL); 
            }

            return 1;
        }

        void webBrowser_DocumentComplete(object pDisp, ref object URL)
        {
            doc = (mshtml.HTMLDocument)webBrowser.Document;
            iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;

            //register event handler for onclick 
            iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(iEvent_onclick);
        }

        bool iEvent_onclick(mshtml.IHTMLEventObj pEvtObj)
        {
            MessageBox.Show(pEvtObj.srcElement.tagName);
            return true;
        }        

        /***********************************************************************
         * We need these functions for the registry entries. Else the browser wouldn't
         * know that we exist.
         * 
        ***********************************************************************/
        [ComRegisterFunction]
        internal static void RegisterFunction(Type typeToRegister)
        {
            try
            {
                Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{" + GUID + "}");
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
            }
        }

        [ComUnregisterFunction]
        internal static void UnregisterFunction(Type typeToRegister)
        {
            try
            {
                Microsoft.Win32.Registry.LocalMachine.DeleteSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{" + GUID + "}");
            }
            catch (ArgumentException e)
            {
                System.Console.WriteLine(e.StackTrace);
            }
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.