5

デスクトップ全体にほとんど透明なウィンドウとして浮かぶ非常に特殊なアプリを C# で作成しています。マウスイベントを作成して背後のアプリケーションに渡し、それらのイベントに応答して「正常に」動作しているように見せたいです。ウィンドウマネージャーが応答できることも望ましいでしょう。

私は Windows の第一人者ではなく、これを実現する最善の方法がわかりません。

このページから: http://bytes.com/forum/thread270002.html

私のアプリは他のすべてのものの上に浮かんでいるので、生成されたイベントはその下にある他のアプリには決して届かないと思います。

代替手段は SendMessage のようですが、これにはかなりの量のウィンドウの手動操作が必要であり、生成されるマウス イベントは「本物」ではありません。

これにアプローチする最善の方法について何か考えはありますか?

4

3 に答える 3

3

システムフックやその他の低レベルのソリューションを調べた後、私ははるかに簡単な方法を見つけました。

まず、フォームのTransparencyKeyとBackColorを同じに設定します。私のフォームはすでに視覚的に透明であったため、これは視覚的な違いにはなりませんでしたが、これはマウスイベントを通過させるのに役立ちます。

次に、次のコードは、マウスイベントをフォームに「ドロップ」させます。

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

最後に、TopMostをtrueに設定します。

これで、フォームは視覚的にすべての上に浮かびますが、他のすべてのアプリに焦点を合わせることができなくなります。

于 2008-10-06T10:18:12.180 に答える
2

ユーザー入力のフィルタリングのようなことをしたいようですね。

キーボード/マウスフックが必要なだけかもしれません。

Windows API 呼び出し SetWindowsHookEx を見てみたいと思うかもしれません。

C# でそれを行う方法のサンプルも十分にあるはずです。私が最初に見つけたのはこのリンクでした (おそらく最良の記事ではありませんが、アイデアを提供するはずです)。

于 2008-10-06T08:44:31.170 に答える
1

コントロールを無効にして戻ると、MouseDown イベントを親に渡すことができます。

于 2011-08-17T15:08:45.437 に答える