SetPixel 関数を呼び出して iTunes でピクセルを設定すると、その特定のアプリケーションでピクセルが表示されますが、Windows Media Player で同じ関数を呼び出してもまったく表示されません。また、この機能はフルスクリーン ウィンドウでも機能しないようです。なぜこのような大きな多様性があるのでしょうか? どんな説明でも大歓迎です。前もって感謝します。
2 に答える
前述のように、ウィンドウは自分のウィンドウではないため、期待した結果が得られないことは非常に簡単であり、最終的にはウィンドウの動作を制御できません。
あなたができる2つのこと(明らかに一方が他方よりも優れています)は次のとおりです。
GetDC (NULL)
画面デバイス コンテキストへのハンドルを取得するために使用します。ClientToScreen
画面上のピクセルの位置を計算するために使用します。SetPixel
そのハンドルで呼び出します。ただし、これはかなり迅速にクリアされます。適切なカラー キーを使用して、独自の最上位のポップアップ、透明 (メッセージに対して) のレイヤード ウィンドウを作成します。
ClientToScreen
画面の位置を計算するために使用しScreenToClient
、ウィンドウに適切に配置されることを確認するために使用します (理論的には、クライアントのサイズが画面と同じである必要があります)。ピクセルをウィンドウに描画すると、いつ離れるかを制御できます。
2 番目を使用する場合、拡張ウィンドウ スタイルは次のようになります。
WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED
通常のウィンドウ スタイルは次のようになります。
WS_POPUP | WS_VISIBLE
GetSystemMetrics
寸法は、 と の値を使用してSM_CXSCREEN
見つけることができますSM_CYSCREEN
。
カラーキーを設定するには、次を使用しますSetLayeredWindowAttributes
。
SetLayeredWindowAttributes (hwnd, RGB (red, green, blue), 0, LWA_COLORKEY);
red
、green
、およびはウィンドウblue
の背景色を構成し、実際の色として表示されることはありません。そうすれば、背景は描画されず、ユーザーに目立たない違いを与えますが、何かが描画されると表示されます.
コントロールの描画は、コントロールのWM_PAINTハンドラーで実行する必要があります。それはあなたのコントロールではないので、あなたはメッセージループに直接アクセスすることはできません。これは、コントロールが無効になっている場合、ピクセルが失われることを意味します。
ビデオを再生したり、コンテンツを頻繁に更新したりするアプリケーションは、フレームごとにコントロールを無効にします。これにより、コントロールが非常に迅速に更新されます。
ここでは、透明なオーバーレイウィンドウが唯一の方法だと思います。コントロールがメッセージループを処理した後、メッセージループにフックして、WM_PAINTハンドラーに反応できない限り...