gpt4 book ai didi

c# - 将 onmouseover 事件分配给我的 htmldocument 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:04 25 4
gpt4 key购买 nike

我正在开发一个项目,我正在编写一个 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# 应用程序中使用?

如果有什么不明确和不明确的地方,请告诉我。在此先感谢您的帮助和想法。我非常感谢任何意见和帮助。

更新:

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

更新2:

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

在 visual studio 中:菜单 >> 调试 >> 异常 >> CLR 异常 >> 系统并检查 SystemInvalidCastException 的抛出选项。

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

Handler(Document.parentWindow.@event); 

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

我想我应该将 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();
}
}

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

关于c# - 将 onmouseover 事件分配给我的 htmldocument 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com