2

Internet Explorerの実行中のインスタンスからカーソルの下にある現在の要素を取得したいac# windowsアプリケーションを作成しているプロジェクトに取り組んでいます。

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#アプリケーションで使用することは可能ですか?

不明確で曖昧なことがあれば教えてください。ヘルプやアイデアを事前に感謝します。私はコメントと助けに大いに感謝します。

アップデート:

私の2番目の質問に答えるために、を取得することは可能のようですがe.srcElement.innerHTML、メソッドが呼び出されないIHTMLEventObj e理由は本当にわかりません。BrowserEventHandlerアイデアやヒントはありますか?

update2:

わかりました、問題が見つかりました。最初に、プロジェクトのいくつかの設定を変更して、例外が最初に発生する行を取得しました(これは最初のチャンスの例外であるため)。

Visual Studioの場合:メニュー>>デバッグ>>例外>> CLR例外>>システムを選択し、SystemInvalidCastExceptionのスローオプションを確認します。

問題はこのDHTMLEventHandlerクラスの行にあることがわかりました。

Handler(Document.parentWindow.@event); 

最近の検索によると、sにInvalid Cast Exception関連していると思うスローです。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 に答える