🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

Q&A

解決済

1回答

4008閲覧

WPFでフォーカスを受け取らないウィンドウを作りたい

wakasan

総合スコア6

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

0グッド

0クリップ

投稿2021/02/13 14:30

WPFでガジェットのようなアプリケーションを作ろうとしています。

通常、アプリがフォーカスを受け取るとアプリがアクティブになり
直前まで操作していたウィンドウがアクティブではなくなります。

今回やりたいことは
アプリを常に最前面に表示させつつ
アプリ上に設置しているボタンを押下しても、直前まで操作していたウィンドウがアクティブのままとなるような仕組みを実装したいです。

windows10で標準で搭載されている非常に似た機能としては
音声認識ウィンドウです。

「設定」-「簡単操作」-「音声認識」で音声認識をオンにした場合
Windows + Ctrl + S でマイク入力用のガジェットが起動されます。
このガジェット内のボタンを押下しても、ガジェットがフォーカスを奪わないようです。
![イメージ説明

フォーカスを受け取らないウィンドウの実装方法をご存じの方いらっしゃらないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず起動時にアクティブ化しないようにします。
WPF アプリケーションで起動時にウィンドウをアクティブ化しないようにする

次に、Loadedイベントでウィンドウスタイルを変更します。適用しているウィンドウスタイルの意味については細かく説明しませんので、MSのページで確認してください。
Extended Window Styles

C#

1using System; 2using System.Windows; 3using System.Runtime.InteropServices; 4 5namespace WpfApp1 6{ 7 public partial class MainWindow : Window 8 { 9 [DllImport("user32.dll")] 10 private static extern IntPtr GetWindowLongPtr(IntPtr hwnd, int index); 11 12 [DllImport("user32.dll")] 13 private static extern IntPtr SetWindowLongPtr(IntPtr hwnd, int index, IntPtr newValue); 14 15 private int GWL_EXSTYLE = -20; 16 17 private enum WS_EX : long 18 { 19 TOOLWINDOW = 0x00000080, 20 NOACTIVATE = 0x08000000, 21 } 22 23 public MainWindow() 24 { 25 InitializeComponent(); 26 } 27 28 private void Window_Loaded(object sender, RoutedEventArgs e) 29 { 30 var helper = new System.Windows.Interop.WindowInteropHelper(this); 31 var hwnd = helper.Handle; 32 var oldStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); 33 var newStyle = new IntPtr(oldStyle.ToInt64() | (long)WS_EX.NOACTIVATE | (long)WS_EX.TOOLWINDOW); 34 SetWindowLongPtr(hwnd, GWL_EXSTYLE, newStyle); 35 } 36 } 37}

タスクバーを押したらアクティブになりますが、タスクバー消したり出来るかは自分で調べてみてください。

投稿2021/02/14 01:31

編集2021/02/14 01:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

wakasan

2021/02/14 05:29

回答ありがとうございます! 動作確認してみました。 完璧です… まさにこの動作が求める物でした。 各関数の動作から勉強させていただきます! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問