

赤で背景を塗りつぶした画像をWindowsFormの背景にセットし、TransparencyKeyをRedに  
することで、背景抜きされた画像の形にフォームが出来上がります(FormBorderStyleで縁を消すか否かは別)。  
通常この状態ですと、図のように星と星の間の空いている場所は背面のデスクトップの操作ができるのが普通です。

しかし、この上にPanelなどをDock.Fillなどで張り付け、そのPanelのBackColorをTransparentにし、見た目上は同じフォームになりますが、そのPanelなどがデスクトップ側の操作を妨げてしまっているようです。

当然、PanelなどのコントロールにはTransparencyKeyなどはなく、例え背景が透明で抜けていても背面側の操作ができません。

Dock.Fillでフォームいっぱいにコントロールを広げた場合でも、透過されている部分は背面の操作ができるようにする方法はありますでしょうか。

よろしくお願いいたします。

[![画像の説明をここに入力](https://i.stack.imgur.com/kKmNG.jpg)](https://i.stack.imgur.com/kKmNG.jpg)

* * *

**追記**

本日(11/15)、もう一度ゼロから作り直してみたのですが、BackColor、TransparencyKeyともに同じ色にして実行したところ、背景は今まで通り抜けるのですが、背面側の操作ができません。

今迄は何もなくとも透過部分は背面の操作ができた気がしたのですが、最近の.Netになって仕様が変更になったのでしょうか？

念のためDesign側のコードを掲載します。

[code]

    namespace WindowsFormsApp1
    {
        partial class Form1
        {
            /// <summary>
            /// 必要なデザイナー変数です。
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// 使用中のリソースをすべてクリーンアップします。
            /// </summary>
            /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Windows フォーム デザイナーで生成されたコード
    
            /// <summary>
            /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
            /// コード エディターで変更しないでください。
            /// </summary>
            private void InitializeComponent()
            {
                this.SuspendLayout();
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.BackColor = System.Drawing.Color.Red;
                this.BackgroundImage = global::WindowsFormsApp1.Properties.Resources.star;
                this.ClientSize = new System.Drawing.Size(800, 450);
                this.Name = "Form1";
                this.Text = "Form1";
                this.TransparencyKey = System.Drawing.Color.Red;
                this.ResumeLayout(false);
    
            }
    
            #endregion
        }
    }
    
[/code]


CC BY-SA 4.0
2019-11-13T06:21:55.570
60472
2022-08-19T22:02:45.280
2019-11-15T00:34:31.593
3060
9374
question
c# form
C# TransparencyKeyで背景抜きをしたフォームに透明のPanelなどを重ねると、背面の操作ができない


Form の Region を 設定すると そのフォームが切り取られたようになります。

[code]

            private void Form2_Shown(object sender, EventArgs e)
            {
                GraphicsPath graphicsPath = new GraphicsPath();
                graphicsPath.AddEllipse(0, 0, 100, 100);
                Region = new Region(graphicsPath);
            }
    
[/code]

Region を Bitmap から生成するのは  
<https://smdn.jp/programming/tips/create_region_from_bitmap/>  
を参考にできます。

また、文字列から Region を生成するのは  
<https://qiita.com/Zuishin/items/0de2c21fbac5d0190c8b>  
を参考にして

[code]

    var graphicsPath = new GraphicsPath();
    graphicsPath.AddString("★", new FontFamily("メイリオ"), 0, 50, new Point(0, 0), StringFormat.GenericDefault);
    Region = new Region(graphicsPath);
    
[/code]

と書く事ができます。  
Form の 形を変えないと 見た目だけ透明にしても 後ろの操作はできないはずです。


CC BY-SA 4.0
2019-11-13T10:58:09.740
60481
2019-11-15T03:55:29.137
2019-11-15T03:55:29.137
18851
18851
60472
answer


直近質問のコメントつながりで、こちらに回答しておきます。  
以下の英語版StackOverflow記事によると、結構昔からあるバグで、BackColor、TransparencyKeyに設定する色情報の中のR:赤とB:青の値が同じ数値でないとマウス等の透過が行われないようです。  
[C# Form.TransparencyKey working different for different colors,
why?](https://stackoverflow.com/q/4448771/9014308)

> While I do not know what causes it, I can tell you that you can achieve
> click through for 100% of colors where the red and blue channels are equal.
> For instance, Color.FromArgb(255, 61, 139, 61) will allow click through, but
> Color.FromArgb(255, 10, 20, 30) will not.
>
>
> 何が原因かはわかりませんが、赤と青のチャネルが等しい色の100％でクリックスルーを達成できることを伝えることができます。たとえば、Color.FromArgb（255、61、139、61）はクリックスルーを許可しますが、Color.FromArgb（255、10、20、30）は許可しません。
>
> Thanks for your reply. I tested it and you're right. I can click through
> without Aero enabled. Now the funny thing is that I actually made use of
> this bug. I have one transparent window that I can't click through (so I can
> use OnMouseMove event with it) and second with other transparency key that I
> can click through (what is what I want). Now I know that without Aero or on
> XP it won't work... Fortunately it's for my personal use only ;).
>
>
> お返事をありがとうございます。私はそれをテストしました、あなたは正しいです。Aeroを有効にしなくてもクリックスルーできます。面白いのは、実際にこのバグを利用したことです。クリックできない透明なウィンドウ（OnMouseMoveイベントを使用できる）と、クリック可能な他の透明キー（必要なもの）があります。今、私はAeroまたはXPでは動作しないことを知っています...幸いなことに、それは私の個人的な使用のみです;）。
>
> Hehe, yeah, this bug has been around for a while. When they don't fix it, it
> becomes a feature making our lives pretty rough.
>
> へへ、そう、このバグはしばらく前から存在している。彼らがそれを修正しないとき、それは私たちの生活をかなり荒くする特徴になります。

例えばFormのBackColorのデフォルトの[SystemColors.Control](https://docs.microsoft.com/ja-
jp/dotnet/api/system.drawing.systemcolors.control?view=netframework-4.8#System_Drawing_SystemColors_Control)はマウス透過出来ますが、その色を表示で使いたい場合もあるでしょうから、以下の中から使わなそうな色を選ぶか、数値を指定してカスタマイズすると良いでしょう。  
[SystemColors クラス](https://docs.microsoft.com/ja-
jp/dotnet/api/system.drawing.systemcolors?view=netframework-4.8)  
[Color 構造体](https://docs.microsoft.com/ja-
jp/dotnet/api/system.drawing.color?view=netframework-4.8)


CC BY-SA 4.0
2020-02-16T08:14:12.683
63087
2020-02-16T08:14:12.683
2020-06-17T08:14:45.997
-1
26370
60472
answer