実際、これを正しい方法で実行しているように、私は笑っている必要はありません。あなたはデスクトップを所有していないので、デスクトップに直接描画するべきではありません。代わりに、あなたはdo自分が持っている透明なフォームを重ね合わせてシミュレートする必要があります。透明なオーバーレイフォームを所有しているため、それを描画することは問題ありません。
しかし、それ以外にも、実際に何が実際に行われているかをはっきりと理解していないと、ランダムに値を試しているように思えます。それはあなたの目を閉じてダーツを投げるようなものです。非常に高いヒット数はありません。
まず、コードが何をしているかを理解しましょう。マジックの値0x84
は、WM_NCHITTEST
メッセージに対応しています。このメッセージは、ウィンドウがマウスのクリックをどのように処理するかを決定するためにウィンドウによって送信されます。このメッセージに応答して、リンクされたドキュメントに記載されているHT*
のいずれかの値で返信します。これらの値のそれぞれは、特定の意味を持ちます。例えば:(2の値を有する)
HTCAPTION
ウィンドウのクリック部分はウィンドウのキャプション/タイトルバーとして扱われるべきであることを意味します。 Windowsを使用することから、タイトルバーを使用してウィンドウを画面上でドラッグすることができることがわかっているので、マウスクリックに応じてHTCAPTION
を返すと、ウィンドウをドラッグ可能にすることができます。これはボーダーレスフォーム(タイトルバーのないフォーム)で使用され、移動可能になります。
HTTRANSPARENT
(値は-1です)は、もう1つの値です。これはかなり簡単です。それはあなたのウィンドウを透明に見せかけるだけです。それは、「私に気をつけない、ここには窓がない」というようなものです。マウスクリックは、あなたがそこにいないかのように、Zオーダーのあなたの下にあるウィンドウに単に渡されます。
HTCLIENT
(値は1)は、クリックがウィンドウのクライアント領域のどこかで発生した場合のデフォルトの結果です。すべてを正常に動作させるには、これを返す(または単にデフォルトのウィンドウプロシージャを呼び出す)でしょう。この値を返すクリックイベントは、フォームのClick
イベントを発生させるか、フォームにある子コントロールに渡すことで、フレームワークによって正常に処理されます。
あなたがない描画しているときに、あなたはおそらくHTTRANSPARENT
を返すようにしたいです。 がの場合、HTCLIENT
を返して、描画コードがマウスイベントを表示して結果を描画できるようにします。
そして、あなたのコードを修正:あなたはわずか5%程度を好きで、非アクティブに透明キーを残すためにあなたのウィンドウの可視性を設定することをお勧めします
// Code for allowing clicking through of the form
protected override void WndProc(ref Message m)
{
const uint WM_NCHITTEST = 0x84;
const int HTTRANSPARENT = -1;
const int HTCLIENT = 1;
const int HTCAPTION = 2;
// ... or define an enum with all the values
if (m.Msg == WM_NCHITTEST)
{
// If it's the message we want, handle it.
if (penMode)
{
// If we're drawing, we want to see mouse events like normal.
m.Result = new IntPtr(HTCLIENT);
}
else
{
// Otherwise, we want to pass mouse events on to the desktop,
// as if we were not even here.
m.Result = new IntPtr(HTTRANSPARENT);
}
return; // bail out because we've handled the message
}
// Otherwise, call the base class implementation for default processing.
base.WndProc(ref m);
}
を助けたときに、ウィンドウの透明部分は、親ウィンドウにメッセージを送信しません。マウスをクリックします。 (メッセージとSpy ++のログ記録で確認されます)。 –
@Cody、うわー、そんなにクリアで完全な答えがありがとう!それはいいようですが、私が今見ているのは、ポイントを描いた後、そのポイントをもう一度クリックすると、透明ではなく青色になります。 –
Windows 10では動作しませんジョンが言及したのと同じ理由。 –