2

アプリケーションは、Enum*ルーチンを使用してウィンドウハンドルを取得します。

アプリケーションが列挙/作成されたウィンドウのハンドル(クラス名の取得、ウィンドウ統計など)を管理している間、ハンドルが無効になることがあります。ウィンドウハンドルを管理するコードは、try / catchブロックを使用して保護されますが、ウィンドウハンドルは保存され、表示されたウィンドウを管理するために連続して使用されます。

ウィンドウハンドルの有効期間を処理する方法は?ハンドルの無効を検出することは可能ですか?

アプリケーションがウィンドウハンドルを使用するたびに、try/catchブロックを回避したいと思います。

4

4 に答える 4

2

ウィンドウハンドルは、ウィンドウを作成したスレッドから使​​用された場合にのみ安全です。他のスレッドから、ウィンドウハンドルについて知ることができるのは、過去のある時点で有効だったということだけです。現在、そうである場合とそうでない場合があり、そうである場合は、完全に意図されたものとは異なるウィンドウを参照している可能性があります。

于 2010-08-02T18:58:46.960 に答える
2

私はすでに実際の解決策を持っています...しかし私は今までこれについて知りませんでした!

ウィンドウハンドルの有効期間について明確にしていただきありがとうございますが、実際にはウィンドウハンドルの有効期間について検出する方法があります:CbtProc

フックがシステム全体にインストールされている場合、ウィンドウの破棄について特定のアプリケーション(CBTフックの実際の実装にすべて依存します)に通知することができます。これは、通知後に特定のハンドルが無効になることを示します。

ドキュメントから:

HCBT_DESTROYWND破棄されようとしているウィンドウへのハンドルを指定します。

もちろん、WINAPIルーチンを使用したハンドルへのアクセスは通知システムと同期する必要がありますが、これは実現可能性が低いようです(CBTフックは、アプリケーションロジックと同期しているため、実際にはウィンドウの破棄をブロックします)。

于 2010-08-03T16:33:12.047 に答える
1

に渡してIsWindow()検証することができます。
注意点がいくつかありますが、どちらもこれに対するほとんどすべてのアプローチに当てはまります。

この関数が呼び出された後にウィンドウが破壊される可能性があるため、スレッドは、作成されなかったウィンドウにIsWindowを使用しないでください。さらに、ウィンドウハンドルはリサイクルされるため、ハンドルが別のウィンドウを指すこともあります。

独自の外部アプリの1つでウィンドウにこれを行う場合は、ある種の一意の識別子をSet / GetProp()することで、検証の第2層を追加できます。

于 2010-08-02T11:01:23.023 に答える
0

この機能を使用できますGetWindowInfo。ハンドルが無効な場合は0を返します。

于 2010-08-02T10:42:53.993 に答える