分配onmouseover事件到我的htmldocument是不工作的

本文关键字:工作 htmldocument 我的 onmouseover 事件 分配 | 更新日期: 2023-09-27 18:07:04

我正在做一个项目,我正在编写一个c# windows应用程序,它想从正在运行的Internet Explorer实例中获取光标下的当前元素。

我可以得到IE运行实例的IHtmlDocument2的句柄,我想给它分配onmouseover事件,像这样:

 DHTMLEventHandler myHandler = new DHTMLEventHandler(htmlDocument);
 myHandler.Handler += new DHTMLEvent(this.BrowserEventHandler);
 htmlDocument.onmouseover = myHandler;

因为我不想让IE吃其他事件(一个著名的但已经解决的问题),我应该创建一个DHTMLEventHandler类,像这样:

public delegate void DHTMLEvent(IHTMLEventObj obj);
[ComVisible(true)]
public class DHTMLEventHandler
{
    public DHTMLEvent Handler;
    private IHTMLDocument2 Document;
    public DHTMLEventHandler(IHTMLDocument2 doc)
    {
        Document = doc;
    }
    [DispId(0)]
    public void Call()
    {
        Handler(Document.parentWindow.@event);
    }
}

我的BrowserEventHandler方法是这样的:

public void BrowserEventHandler(IHTMLEventObj e)
    {
    }

仍然是空的(但我想得到元素的innerHtml光标下),但这个方法仍然是空的,我得到:

系统类型的第一次异常。InvalidCastException' occurred in FindText.exe

每当我移动鼠标。

问题:

  1. 为什么我得到这个异常?
  2. 是否有可能在变量中获得e.s relement .innerhtml并在我的c#应用程序中使用?

如果有什么不清楚和模棱两可的地方请告诉我。提前感谢任何帮助和想法。我非常感谢您的评论和帮助。

更新:

回答我的第二个问题,似乎有可能得到IHTMLEventObj ee.srcElement.innerHTML,但我真的不知道为什么BrowserEventHandler方法从未被调用。有什么想法或提示吗?

更新2:

好的,我找到问题了。首先,我改变了我的项目的一些设置,以获得异常首先发生的行(因为它是第一次机会异常),像这样:

在visual studio中:Menu>> Debug>> Exceptions>> CLR Exceptions>> system并检查SystemInvalidCastException的抛出选项。

我发现问题是这一行DHTMLEventHandler类:

Handler(Document.parentWindow.@event); 

它抛出Invalid Cast Exception,根据我最近的搜索,我认为它与Thread s有关。

我想我应该设置ApartmentState为ApartmentState.STA。但我不知道怎么做。什么好主意吗?

分配onmouseover事件到我的htmldocument是不工作的

好了,我找到解决方案了!:)

我需要像这样改变DHTMLEventHandler类:

public delegate void DHTMLEvent(IHTMLEventObj obj);
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class DHTMLEventHandler
{
    private Thread currentThread;
    public DHTMLEvent Handler;
    private IHTMLDocument2 Document;
    public DHTMLEventHandler(IHTMLDocument2 doc)
    {
        Document = doc;
    }
    [DispId(0)]
     [STAThread]
    public void Call()
    {
        currentThread = Thread.CurrentThread;
       Thread parentWin = new Thread(new ThreadStart(pWindowHandler));
        parentWin.SetApartmentState(ApartmentState.STA);
        parentWin.Start();
        currentThread.Suspend();
       // Handler(Document.parentWindow.@event);
    }
    public void pWindowHandler()
    {
        Handler(Document.parentWindow.@event);
        currentThread.Resume();
    }
}

但是如果其他人试图使用我的解决方案,我不知道它在其他情况下是否有任何副作用。至少对我来说还行!:)

设置公寓使用http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx