将onmouseover事件分配给我的htmldocument是行不通的

时间:2011-08-28 16:41:50

标签: c# ihtmldocument2

我正在开发一个项目,我正在编写一个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),但是这个方法仍然是空的,我得到:

FindText.exe中出现'System.InvalidCastException'类型的第一次机会异常

每当我移动鼠标时。

问题:

  1. 为什么我得到这个例外?
  2. 是否可以在变量中获取e.srcElement.innerhtml并在我的c#应用程序中使用?
  3. 让我知道是否存在不清楚和含糊不清的内容。提前感谢任何帮助和想法。我非常感谢任何评论和帮助。

    更新

    要回答我的第二个问题,似乎可以获得e.srcElement.innerHTML的{​​{1}},但我真的不知道为什么永远不会调用IHTMLEventObj e方法。有什么想法或提示吗?

    UPDATE2:

    好的,我发现了问题。首先,我更改了项目的一些设置,以便首先获得异常发生的行(因为这是第一次机会异常),如下所示:

    在visual studio中:菜单>>调试>>例外>> CLR例外>>系统并检查SystemInvalidCastException的throw选项。

    我发现问题出在BrowserEventHandler类的这一行:

    DHTMLEventHandler

    根据我最近的搜索,它会抛出Handler(Document.parentWindow.@event); 我认为与Invalid Cast Exception相关的内容。

    我想我应该将ApartmentState设置为Thread。但我不知道怎么做。任何想法?

2 个答案:

答案 0 :(得分:1)

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

我需要像这样更改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();
    }
}

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

答案 1 :(得分:0)