質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

2739閲覧

WPFで最背面表示を実装する

Poriet_Gadget

総合スコア15

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2022/05/21 05:31

編集2022/05/21 09:18

WPFを使ってデスクトップに常駐するアプリを作ろうとしているのですが、WPFで最背面表示をする方法が分かりません。
FormsではDLLImportを使うとできるらしいのですが、WPFではどうすればいいでしょうか?
http://jeanne.wankuma.com/tips/csharp/form/bottommost.html
ここでのDLLのインポートはSystem.Runtime.InteropServicesの[DLLImport]のことです。
WPFではMainWindowをProgram Managerの親ウィンドウにすることはできたのですが、親ウィンドウに設定しても非表示になってしまいます。

C#

1[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 2static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 3[System.Runtime.InteropServices.DllImport("user32.dll")] 4static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 5 6public void Desktop() 7{ 8 IntPtr tmpdesktop = FindWindow(null, "Program Manager"); 9 if (tmpdesktop != null) 10 { 11 var wih = new System.Windows.Interop.WindowInteropHelper(this); 12 SetParent(wih.Handle, tmpdesktop); 13 } 14} 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/05/21 06:34 編集

質問者さんの言う DllImport でインポートする dll とは具体的に何なのですか? WinForms ではインポートできるが WPF ではその dll がインポートできないと言ってます?
dodox86

2022/05/21 06:49

> FormsではDLLImportを使うとできるらしいのですが、 P/Invoke(Platform Invoke)で使うDllImport属性のことでしょうか。 その手の操作にはWin32 APIのSetWindowPos関数が良く使われます。WPFやお造りのアプリの形態にもよるので改めて検索、調査するなどしてみてください。 [質問するときのヒント] https://teratail.com/help/question-tips
退会済みユーザー

退会済みユーザー

2022/05/21 09:19 編集

dll の情報が無いと思っていましたが追加した URL の記事のものですね。失礼しました。
guest

回答2

0

解決されたようですが、閲覧者向けにまとめておきます。

まずProgram Managerの子ウィンドウにするような手法は、あまりよろしくないようです。
c# - Window "on desktop" - Stack Overflow

一応動きはしましたが、Vistaのような残念な見た目になってしまいましたw(何か手はあるのかもしれませんが深堀しません)
Vistaのような残念な見た目


SetWindowPosするのがいいようですが、タイミングによって効かなかったりチラついたりしました。

安定したのは参考リンクの一番下の(一番新しい)回答でした。
c# - Window "on desktop" - Stack Overflow

下記を使用しました(「プレリリースを含める」をチェックしないと出ないので注意)
NuGet Gallery | Microsoft.Windows.CsWin32 0.1.691-beta

xml

1<Window 2 x:Class="Q05wtn9uoflyayp.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450" 7 Closing="Window_Closing" 8 SourceInitialized="Window_SourceInitialized"> 9 <Window.Resources> 10 <Style BasedOn="{StaticResource {x:Type ToggleButton}}" TargetType="{x:Type RadioButton}"> 11 <Setter Property="Margin" Value="10" /> 12 </Style> 13 </Window.Resources> 14 <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 15 <RadioButton Content="None" /> 16 <RadioButton 17 Checked="SetParent_Checked" 18 Content="SetParent" 19 Unchecked="SetParent_Unchecked" /> 20 <RadioButton 21 x:Name="SetWindowPos_RadioButton" 22 Content="SetWindowPos" 23 IsChecked="True" /> 24 </StackPanel> 25</Window>

cs

1using System; 2using System.Runtime.InteropServices; 3using System.Windows; 4using System.Windows.Interop; 5using Windows.Win32.Foundation; 6using Windows.Win32.UI.WindowsAndMessaging; 7using static Windows.Win32.PInvoke; 8using static Windows.Win32.UI.WindowsAndMessaging.SET_WINDOW_POS_FLAGS; 9 10namespace Q05wtn9uoflyayp 11{ 12 public partial class MainWindow : Window 13 { 14 public MainWindow() => InitializeComponent(); 15 16 private void Window_SourceInitialized(object sender, EventArgs e) 17 { 18 var hWnd = new WindowInteropHelper(this).Handle; 19 SetWindowPos((HWND)hWnd, HWND.HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 20 HwndSource.FromHwnd(hWnd).AddHook(new HwndSourceHook(WndProc)); 21 } 22 23 private void SetParent_Checked(object sender, RoutedEventArgs e) 24 { 25 var hWnd = new WindowInteropHelper(this).Handle; 26 var hWndProgMan = FindWindow("Progman", "Program Manager"); 27 SetParent((HWND)hWnd, hWndProgMan); 28 } 29 private void SetParent_Unchecked(object sender, RoutedEventArgs e) 30 { 31 var hWnd = new WindowInteropHelper(this).Handle; 32 SetParent((HWND)hWnd, (HWND)IntPtr.Zero); 33 } 34 35 private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 36 { 37 if (SetWindowPos_RadioButton.IsChecked != true) return IntPtr.Zero; 38 39 if (msg == WM_WINDOWPOSCHANGING) 40 { 41 var windowPos = Marshal.PtrToStructure<WINDOWPOS>(lParam); 42 windowPos.flags |= SWP_NOZORDER; 43 // こうするほうがいいような気もするけど、同じことしているウィンドウがあると取り合いになるか? 44 //windowPos.hwndInsertAfter = HWND.HWND_BOTTOM; 45 Marshal.StructureToPtr(windowPos, lParam, false); 46 } 47 48 return IntPtr.Zero; 49 } 50 51 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 52 { 53 var hWnd = new WindowInteropHelper(this).Handle; 54 HwndSource.FromHwnd(hWnd).RemoveHook(new HwndSourceHook(WndProc)); 55 } 56 } 57}

txt:NativeMethods.txt

1FindWindow 2SetParent 3SetWindowPos 4WINDOWPOS 5SWP_NOSIZE 6SWP_NOMOVE 7SWP_NOACTIVATE 8SWP_NOZORDER 9HWND_BOTTOM 10WM_WINDOWPOSCHANGING

投稿2022/05/21 11:09

編集2023/07/30 08:33
TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

C#

1[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 2 static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 3 [System.Runtime.InteropServices.DllImport("user32.dll")] 4 static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 5 [System.Runtime.InteropServices.DllImport("user32.dll")] 6 static extern Boolean SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y,int cs, int cy, int uFlags); 7 private int SWP_NOSIZE = 1; 8 private int SWP_NOMOVE = 2; 9 private int SWP_NOACTIVATE = 10;

これを利用することで動きました!ありがとうございます!

投稿2022/05/21 09:44

Poriet_Gadget

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問