私は、アプリケーションが画面全体で最大化された半透明のフォーム(黒色の背景色で60%の不透明度)を作成しました。基本的には、デスクトップ全体に灰色の色を塗りつぶします。半透明のウィンドウを無視しながら、マウスポインタの下のウィンドウハンドルを取得します
ユーザーがデスクトップ上のウィンドウをマウスオーバーすると、そのウィンドウのハンドル(hWnd)を取得します。私のために働いている
これを行う簡単な方法は、次のとおりです。
- 一時的に自分のフォームを非表示(OR、一時的に0.0に私のフォームの不透明度を設定)
- コール[GetCursorPos] [1]
- コール[WindowFromPoint] [2]
- は私のフォームが再び
このアプローチの問題があるということを表示します私のフォーム/画面が点滅します。私は好きではありません。
私は(合格-での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を使ってみましたが、私は彼らが私の場合を処理するつもりはないと思います。
ご協力いただければ幸いです。
私は新しいユーザーであるので、便利なリンクを削除する必要がありました。それは色あせています。 – yarone
トップレベルのウィンドウを探しているのですか、または子ウィンドウが必要ですか?そして、あなたが出会った半透明の窓をどのように扱いたいのですか? –
@ David-Heffernanはい、トップレベルのウィンドウ(デスクトップの直下の子)のみを探します。 – yarone