8

プロセス内の子ウィンドウでウィンドウ ハンドルを取得しようとしていますが、ウィンドウ クラス名しか情報がありません。そのために使用できるwin32関数はありますか? 私はC#からこれをやっています。

もう少し詳しく: これは C# で記述された Visual Studio プラグインです。だから私のプロセスは、たくさんのウィンドウがあるビジュアルスタジオです。そのうちの 1 つに、ウィンドウ クラス「VsTipWindow」があります。そのウィンドウの直接の親ウィンドウはわかりません。私が持っているのはクラス名だけです。それだけでウィンドウハンドルを取得する方法はありますか?

4

4 に答える 4

3

FindWindowは、これに必要な Win32 呼び出しです (または、特定のクラス名を持つウィンドウが複数あり、 FindWindowが探しているウィンドウを返さない場合は FindWindowEx です)。

于 2010-05-31T13:50:57.253 に答える
1

単なる追加情報..ポイント WindowFromPoint
からウィンドウのハンドルを取得できることを知っておくと便利かもしれませんhttp://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

于 2010-05-31T13:59:31.430 に答える
0

最初に、ウィンドウとウィンドウ クラスの間には 1 対 1 の関係がないことに注意してください。複数のウィンドウが同じクラスを使用する可能性があります。

あなたの唯一のオプションは、最上位のVisual Studioウィンドウ(または、VsTipWindowウィンドウの祖父母であることがわかっている場合は、ウィンドウ階層の上位にある他のウィンドウ)からEnumChildWindowsを再帰的に呼び出すことだと思います。 GetClassName を取得し、ウィンドウが見つかるまで文字列を VsTipWindow と比較します。

あなたが不明な親について話したので、私はあなたが子ウィンドウの後にいると仮定していますが、このウィンドウがトップレベルのウィンドウである場合は、EnumWindows を使用する必要があります (そして、おそらく GetWindowThreadProcessId を使用して、後で正しいプロセスを取得することを確認する必要があります)そのクラス名のウィンドウが見つかります)

(.NETにはネイティブAPIと同じことを行う関数があると確信しています。そうしないと、PInvokeが必要になります)

于 2010-05-31T13:54:33.360 に答える
0

Win32 ウィンドウ クラスはコントロールの一般的な実装であり、ウィンドウのハンドルはコントロールのインスタンスです。したがって、同じウィンドウ クラス (例: EDIT) を持つ複数のウィンドウ ハンドルを持つことになります。厳密に言えば、ウィンドウ クラスはウィンドウ プロシージャへのポインタです。

.net (および MFC でさえも) のようなフレームワークは、すべてのウィンドウ コントロールに対して少数のウィンドウ クラスを共有する傾向があり、適切なコントロールにディスパッチします (つまり、単一の汎用ウィンドウ プロシージャがあります)。これは、Visual Studio や Office などの大きなアプリケーションでも同じです。

そのため、ウィンドウ クラスだけで特定のウィンドウを検出することは非常に困難です。ただし、特定のウィンドウ クラスを持つすべてのウィンドウを で列挙できFindWindowます。役立つウィンドウ テキストも取得できます。を使用GetWindowThreadProcessIdすると、ウィンドウが Visual Studio に属しているかどうかを検出できます。

于 2010-05-31T13:57:03.990 に答える