2011-08-04 5 views
3

私は、アプリケーションが画面全体で最大化された半透明のフォーム(黒色の背景色で60%の不透明度)を作成しました。基本的には、デスクトップ全体に灰色の色を塗りつぶします。半透明のウィンドウを無視しながら、マウスポインタの下のウィンドウハンドルを取得します

ユーザーがデスクトップ上のウィンドウをマウスオーバーすると、そのウィンドウのハンドル(hWnd)を取得します。私のために働いている

これを行う簡単な方法は、次のとおりです。

  1. 一時的に自分のフォームを非表示(OR、一時的に0.0に私のフォームの不透明度を設定)
  2. コール[GetCursorPos] [1]
  3. コール[WindowFromPoint] [2]
  4. は私のフォームが再び

このアプローチの問題があるということを表示します私のフォーム/画面が点滅します。私は好きではありません。

  • 私は(合格-でのhWnd ChildWindowFromPointExを呼び出すことにより、直接私のフォームの下のウィンドウのhWndをを取得する方法があるはず図:私は2つの方法でこれを修正しようとした

    デスクトップの場合はCWP_SKIPTRANSPARENT)、動作していないようです。私は[ChildWindowFromPoint] [4]と[RealChildWindowFromPoint] [5]でも成功しました。 (PSレイモンドチェンはhere、これらの呼び出しの間の違いを説明し、ChildWindowFromPointExは私が必要なものを正確に行うために設計されていることに私には思える)

  • は、私が(リフレッシュから一時的に画面を「凍結」のようなものをデスクトップ全体を阻止しようとしました)私のフォームを非表示にする前に(1)SendMessage(GetDesktopWindow(), WM_SETREDRAW, false, 0)を使用して(2)SendMessage(GetDesktopWindow(), WM_SETREDRAW, true, 0)私のフォームを非表示にしてこれはかなりうまくいきませんでした。画面の一部の領域が凍ってしまい、奇妙な黒いブロックが現れるなど、私は知っています。しかし、(1)は働いています。私のデスクトップは完全にフリーズしていました(再起動しなければならず、TaskMgrが正しくレンダリングされませんでした)。私はまた、私のフォームでSuspendLayoutとResumeLayoutを使ってみましたが、私は彼らが私の場合を処理するつもりはないと思います。

ご協力いただければ幸いです。

+0

私は新しいユーザーであるので、便利なリンクを削除する必要がありました。それは色あせています。 – yarone

+0

トップレベルのウィンドウを探しているのですか、または子ウィンドウが必要ですか?そして、あなたが出会った半透明の窓をどのように扱いたいのですか? –

+0

@ David-Heffernanはい、トップレベルのウィンドウ(デスクトップの直下の子)のみを探します。 – yarone

答えて

4

標準機能が提供する機能以上にカスタマイズする必要があるため、自分で確認することができます。

  1. トップレベルウィンドウのリストを取得するには、EnumWindows()を呼び出します。
  2. 半透明のウィンドウをこのリストから削除します。
  3. リスト内の各ウィンドウについて、PtInRegion()を使用して、マウスがウィンドウ上にあるかどうかを判断します。請求書に適合しないウィンドウをすべて取り外します。
  4. GetNextWindow()を使用して、残りのウィンドウの1つから開始してzオーダーを歩き、どの候補が先頭にあるかを調べます。
+0

EnumWindowsはz-orderレンダリング(4)を不要にすることを列挙するかもしれません。 –

+0

文書化されていない場合は、その動作に頼ることはできません –

+0

@sertac私は確かにそれを見ましたが、ドキュメントはありません。私はあなたが正しいと思う。 –

関連する問題