【WPF】ウィンドウを常に最背面にする

WPF WPF

ウィンドウをいつも最背面にして、壁紙のような機能をつくります。
WPFだとWindowクラスにウィンドウハンドルを取得するプロパティが無いので、自分で取得しなければだめそうです。あまりウィンドウハンドルを使うことはないのですが、今後また使うようなことがあるかもしれないので、残しておきます。

Sponsored links
Sponsored links

WPFでウィンドウハンドルを取得する

下記コードでWPFのウィンドウハンドルを取得できます。このハンドルを使ってウィンドウを制御します。

WPFウィンドウを常時最背面にする

ウィンドウのZオーダーを細かく制御するにはWin32APIを使うことになりそうです。
FindWindow関数でProgram Managerのウィンドウハンドルを取得して、そのハンドルをSetParent関数で親ウィンドウのハンドルに設定することで最背面にしてみます。

これで一応はうまく壁紙のように最背面に設定することができました。

しかし、サイネージで使おうと思ったらうまく動作しません。
いろいろと調べていたらProgram Magagerとは、Explorerのことのようです。すなわち、ShellがExplorerになっていないとちゃんと動かないようです。要はExplorer Shellを親ウィンドウとして登録しているだけのようです。
組み込み系のシステムでは、カスタムシェルを使って製品化するので、Explorerシェルはないのです。

ウィンドウメッセージをフックして背面に隠す

ウィンドウハンドルをSetParentする方法ではうまく動作しなかったので、ウィンドウメッセージをフックしてSetWindowsPosで裏に隠すことにしました。ちらつきがあるかなと思ったのですが、特にちらつきもなく動作しています。

タイトルとURLをコピーしました