我正在编写一个项目,我正在编写 ac# 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”类型的第一次机会异常
每当我移动鼠标时。
问题:
- 为什么我得到这个异常?
- 是否可以在变量中获取 e.srcElement.innerhtml 并在我的 c# 应用程序中使用?
让我知道是否有不清楚和模棱两可的地方。提前感谢您的任何帮助和想法。我非常感谢任何评论和帮助。
更新:
要回答我的第二个问题,似乎可以得到e.srcElement.innerHTML
of ,IHTMLEventObj e
但我真的不知道为什么BrowserEventHandler
永远不会调用该方法。有什么想法或提示吗?
更新2:
好的,我发现了问题。首先,我更改了项目的一些设置,以获取首先发生异常的行(因为这是第一次机会异常),如下所示:
在 Visual Studio 中:菜单 >> 调试 >> 异常 >> CLR 异常 >> 系统并检查 SystemInvalidCastException 的抛出选项。
我发现问题出在这一行DHTMLEventHandler
:
Handler(Document.parentWindow.@event);
根据我最近的搜索,它抛出Invalid Cast Exception
了我认为与 s 相关的内容。Thread
我想我应该将 ApartmentState 设置为ApartmentState.STA
. 但我不知道怎么做。有任何想法吗?