3

バックグラウンド

アプリケーションを XenDesktop モードで実行しており、ウィンドウにリアルタイムの情報が表示されます。ただし、その XenDekstop で他のアプリケーションも起動され、そのアプリケーションがウィンドウに重なっている場合は、レンダリングを停止する必要があります。ウィンドウの外に移動したら、再びレンダリングを開始します。残念ながら、現在、この種の通知は Citrix でサポートされていません。

質問

アプリケーション ウィンドウの一部または全体が他のウィンドウと重なったことをどのように検出し、それが重ならなくなったのかを検出するにはどうすればよいでしょうか?

グーグルでWindowFromPointファミリの関数を見つけましたが、ウィンドウがカバーするすべての座標をポーリングし続ける必要があるため、これは私の目的には実用的ではありません。

ボーナス ポイント:まず、このようなオーバーラップがいつ発生するかを検出できれば十分です。ただし、ウィンドウのどの領域がカバーされているかを正確に検出できれば、それは素晴らしいことです。

4

3 に答える 3

3

そのような API 関数はありません。そして、通常は必要ありません。WM_PAINT はそれ自体を処理します。

WM_PAINT メッセージを受け取ると、領域と、再描画が必要な領域の更新矩形を受け取ります。しかし、それは長方形のみであり、複雑な領域ではありません。また、クリッピング領域もあります。

しかし、領域を自分で計算できるはずです。トップレベルのウィンドウについて話している場合。

  • ウィンドウの四角形で構成される長方形の領域を作成します
  • すべての最上位ウィンドウを後ろから前に移動する
  • トップレベルのウィンドウが見つかるまで、すべてのウィンドウを無視します
  • 表示されているトップ レベル ウィンドウごとに、長方形の領域を作成し、現在の領域と XOR します。
  • GetWindow GW_HWNDNEXTで簡単にできるはずです

結果の地域は、あなたが探しているものです。

繰り返しますが、そのようなオーバーラップを見つけるために起動されるか実行できるかを判断する関数やメッセージはありません。そのような情報は必要ありません。システムは、適切な WM_PAINT メッセージで自分自身を管理します。エリアがカバーされている場合。アクションの必要はありません。領域が覆われていない場合、WM_PAINT が発生します。

于 2015-09-23T09:13:16.623 に答える
2

WM_PAINT通常、クリッピング領域はそれに応じて設定されるため、メッセージを処理するときにこの種の情報を取得できるはずです。この関数を呼び出すと、RectVisible()ウィンドウのどの部分についても、「ペイントする必要がある」かどうか (つまり、単にカバーされていないかどうか) がわかります。

于 2015-09-23T08:37:39.047 に答える