5

C# で完全に透明なフォームを作成しようとしていますが、クリックしても下の他のウィンドウに移動できません。有望な 2 つの方法を見つけましたが、希望する結果は得られませんでした。

1 つ目は、背景色と透明度キーを同じ値に設定することです。これにより、透明なフォームが得られますが、クリックすると透過します。

this.BackColor = Color.Red;
this.TransparencyKey = Color.Red;

私が試したもう 1 つのことは、フォームの不透明度を 1% に設定することです。これにより、私が望んでいた効果が作成されます-ほぼ。99% 透明なフォームが得られますが、フォームの下にあるものはわずかに色が変わります。私が作成しているアプリは、色に敏感なコンテキスト (グラフィック デザインなど) で使用することを意図しているため、色のわずかな変更も許容されません。だから私はあなたに目を向けます、親愛なるSO。これはできますか?

4

5 に答える 5

2

私は解決策を見つけました。皆さんにも共有しています。

答えは非常に簡単でした: 私は以下を設定しました:this.TransparencyKey = Color.Lime;

そして、背景画像として 1x1px のライム PNG を使用しました。これには、フォームの境界線とタイトル バーが隠れないという追加の利点もあります。後で削除しますが、現時点では、フォームがどこにあるかを知っておくと便利です。

于 2013-06-19T18:55:29.517 に答える
1

これは次の方法で行うことができます (描画されたフォームが最大化されていると仮定します。そうでない場合は、以下の次の段落を参照してください)。

  • 現在の画面のスクリーンショットを撮ります。
  • フォームを作成し、スクリーンショットを背景画像として使用します。
  • フォームからフォーム タイトルを削除し、単にパネルとして作成します。

上記の解決策はあなたが望むものを解決しますが、次の質問に答える必要があります。

  • ユーザーは描画中のフォームをどのように閉じるのでしょうか?

フォームのサイズ変更・移動が必要な場合 - 複雑版

ただし、このフォームのサイズを変更したい場合 (新しいスクリーンショットでの編集に気付きました)、撮影したスクリーンショットの一部を切り取って、フォームの背景として表示する必要があります。しかし、これはさらに先のことです。フォームのサイズを変更したり移動したりするたびに、これを行う必要があります。

私は個人的に最初の(より単純な)アプローチをとります。

于 2013-06-19T17:23:37.387 に答える
0

マウスイベントをキャッチするフックを設定できます。

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

    [StructLayout(LayoutKind.Sequential)]
    public class MouseStruct
    {
        public Point pt;
        public int hwnd;
        public int wHitTestCode;
        public int dwExtraInfo;
    }

    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); 

    private int hHook;
    public const int WH_MOUSE_LL = 14;
    public static HookProc hProc;

    public int SetHook()                                        
    {
        hProc = new HookProc(MouseHookProc);
        hHook = SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0);
        return hHook;
    }
    public void UnHook()                                        
    {
        UnhookWindowsHookEx(hHook);
    }
    //callback function, invoked when there is an mouse event
    private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)              
    {
        var MyMouseStruct = (MouseStruct)Marshal.PtrToStructure(lParam, typeof(MouseStruct));
        if (nCode < 0)
        {
            return CallNextHookEx(hHook, nCode, wParam, lParam);    
        }
        else
        {
            switch wParam{
                case (IntPtr)513:
                    //click
                    //do whatever you want
                case (IntPtr)512:
                    //move
                case (IntPtr)514:
                    //release
                default:
            }
            Cursor.Position = MyMouseStruct.pt;
            //stop the event from passed to other windows.
            return 1;
        }
    }

詳細については、MSDNを参照してください。

于 2015-07-26T06:25:40.590 に答える