2

我正在编写一个项目,我正在编写 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”类型的第一次机会异常

每当我移动鼠标时。

问题:

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

让我知道是否有不清楚和模棱两可的地方。提前感谢您的任何帮助和想法。我非常感谢任何评论和帮助。

更新:

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

更新2:

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

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

我发现问题出在这一行DHTMLEventHandler

Handler(Document.parentWindow.@event); 

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

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

4

2 回答 2

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();
    }
}

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

于 2011-08-29T08:20:38.900 回答
0

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

于 2011-08-28T20:01:31.163 回答