◆ WPF のウィンドウ透過は AllowsTransparency を True にする
  ◆ WindowStyle を None にしないといけない
◆ WindowStyle が None だと縁もタイトルバーもなくなる
◆ WindowsForms は縁あり透過度に対応してるので WPF コントロールを WindowsForms ホストに埋め込むと WPF の半透明が一応可能 

あまり関連性ないですが続いていたのも最後です

前記事たち
WPF のフォントは汚い?
続・WPF アプリでもコンソールにログしたい
WPF アプリでもコンソールにログしたい

現状とやりたいこと

やりたいことの再確認です

MSYS2 の mintty

mintty-sample

こういうコンソールが理想です

前のこの状態

DebugConsole-sample

ここからフォントの太さはどうにかなったので

半透明にすれば完成です

WPF は通常ウィンドウの半透明はサポートされない

調べていていきなり問題にぶつかりました


透明度を設定するには Window の Opacity プロパティに 0.5 のように透過度を指定するだけですが 透明を許可するオプションを設定しておかないといけません

Window に AllowsTransparency="True" を設定します

ここで問題があって AllowsTransparency を True にする場合は WindowStyle を None にしないといけません
None というのは枠無しでタイトルバーもないので閉じるボタンなどもないウィンドウです

ゲームやウィジェットなら問題ないと思いますが一般的なウィンドウで WindowStyle="None" はちょっと困ります
自力で枠とタイトルバーを作ってしまうこともできなくはないですが できれば避けたいです
独自のデザインにすると浮いてしまうし 標準と同じデザインにするには手間がとてもかかります
特に OS ごとに違うデザインを将来的にも対応させるなんてやってられません

そう考えると 一般的な枠ありウィンドウは透過度をサポートしないといっても問題ないでしょう

外部ツール

AHK や Dexpot など外部のユーティリティツールには透過度を変更できるものがあります

外部からいじれるなら WPF でも透明にできるかも と試してみたのですが 自作の WPF アプリに対しては透過度を変えても全く変わらずずっと不透明のままでした

AllowsTransparency で透過を許可されていないと外部ツールからも透明にできないようです

パソコンに入ってたソフトをいろいろ試したのですが ほとんどのものが透過できていたので いまだに WPF のアプリが少ないことがよく実感できました
まぁ昔からあるものはもちろん パフォーマンス重要なものも Win32API 直接つかって C++ で書かれてるのが普通でしょうしね

WindowsForms

試したソフトの中には個人制作に思えるフリーソフトもあったのですが 透過できました
Win32API とか使わず WindowsForms のデザイナツールでさっと作ったようなものもです

ということは WindowsForms は透明にできる? と思ってちょっと作ってみると

何もしなくても透過できました

プロジェクト作って Form1 作って即実行で本当になにもしてません

こんなに簡単に透明化できるし フォントも GDI を使ってるので WPF みたいに設定しなくても元から細い方 となるとここだけ WindowsForms にしようかとも思ったのですが やっぱり WPF のほうが作りやすいですし WPF に揃えたい気がします


あれこれ考えた結果 WindowsForms の全画面に WPF のユーザコントロールを置くという方法を取りました
すでに作った Window を UserControl に置き換えて WindowsForms に埋め込むだけです

WPF プロジェクトでも新規追加でフォームを追加できるので追加します
追加したら デザイナは使わずに↓のコードを設置します
public partial class Form1 : Form
{
    public Form1()
    {
        var element_host = new System.Windows.Forms.Integration.ElementHost();
        var wpf_control = new UserControl1();
        this.SuspendLayout();

        element_host.Dock = System.Windows.Forms.DockStyle.Fill;
        element_host.TabIndex = 0;
        element_host.Child = wpf_control;

        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.Controls.Add(element_host);
        this.ResumeLayout(false);
    }
}

UserControl1 は WPF のユーザコントロールです
AutoScale などは自動生成についていたのをコピペしてきたものなのでなくてもいいのかもしれません

WPF のときの Title, Width, Height は Form に設定しておかないといけないのでここに移動します
wpf_control をローカル変数で捨てずにプロパティとしてもたせると 外部から操作できるので直接メソッド呼んだりしたいなら入れておきます


完成したコンソール画面がこれです

wpfsmp12265


いい感じな透明感とフォントですね


WindowsForms だけだと WPF より高速で動きが軽いですが WindowsForms の上に WPF を乗せる形になっているのでウィンドウの初期化に普段よりちょっと時間がかかります


それにしても WPF に透明機能がないのはとても意外でした
WindowsForms よりそういうの得意そうなのになんでできないのだろう