3

私は、Windowsマシンで実行されているものを監視するアプリケーションに取り組んでいます。自動化されたプロセス中に特定のダイアログがポップアップした場合にアラームを発生させるために使用されます。Windows APIを使用して、既存のウィンドウのクラス名を取得しています。これは正常に機能します。ただし、これらが.NETアプリケーションの場合、.NETクラス名ではなく、「WindowsForms10.Window.8.app.0.39cfeeb」のようなものになります。さらに悪いことに、クラス名は実行間で一定ではありません。

Windowsハンドルのみが表示されている場合に.NETクラス名を取得する方法はありますか?

4

2 に答える 2

3

はい、これは機能しません。デスクトップセッションのすべての一意のウィンドウには、一意のWindows「クラス名」が必要です。この文字列はRegisterClassEx()winapi関数に渡され、CreateWindowEx()で使用されます。Winformsはそれらの名前を自動生成するため、生成する名前が他のプロセスやアプリドメインのウィンドウの名前と衝突しないようにする負担があります。これらの奇妙な名前が表示されるのはこのためです。最も重要な部分は最後のビット、例では39cfeeb、AppDomain.GetHashCode()によって返される値です。そのハッシュコードを外部プロセスから取得することはできません。

簡単に取得できるクラス名に依存しない、根本的に異なるアプローチが必要になります。Managed Spyコードを見てください。これは、外部WinformsプロセスでのReflectionの使用をサポートしています。使用するDLLインジェクションコード手法を分離して、これを自分のコードで使用できるようにするには、いくつかの作業が必要です。

また、プロセスから.NETクラス名を取得する唯一の方法は、UIオートメーションを使用するときに他の方法では気にしないことです。

于 2012-06-01T13:21:39.680 に答える
2

私はそうは思わない。Windowsのウィンドウの「クラス名」は、.NETクラスとは何の関係もありません。Windowsでは、ウィンドウクラスを登録することは可能ですが、それは基本的にウィンドウスタイルを決定するフラグのコレクションにすぎません。

.NETは、このようなウィンドウクラスをすべてのフォームに登録しているようですが、ランダムに名前を付けているようです。これは、クラス名が一定ではないという事実を説明しています。

于 2012-06-01T12:46:04.517 に答える