分配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
每当我移动鼠标。
问题:
- 为什么我得到这个异常?
- 是否有可能在变量中获得e.s relement .innerhtml并在我的c#应用程序中使用?
如果有什么不清楚和模棱两可的地方请告诉我。提前感谢任何帮助和想法。我非常感谢您的评论和帮助。
更新:
回答我的第二个问题,似乎有可能得到IHTMLEventObj e
的e.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
。但我不知道怎么做。什么好主意吗?
好了,我找到解决方案了!:)
我需要像这样改变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