特定のWPFウィンドウにフォーカスを当てようとしています。つまり、標準のWindowsタスクバーのようにフォーカスを失ったときにウィンドウスタイルを変更しないでください。これを達成するために、WndProc
にフックして、WM_NCACTIVATE
またはWM_ACTIVATE
がfalse(wParam == 0
)に設定されているかどうかを確認し、メッセージをhandled = true;
とマークしてウィンドウが非アクティブにならないようにします。ここではいくつかのサンプルコードは、次のとおりです。スタートアップウィンドウでWM_NCACTIVATEを処理すると他のすべてのウィンドウがブロックされる
void Window_Loaded(object sender, RoutedEventArgs e)
{
var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
if (source != null) source.AddHook(WndProc);
}
private const uint WM_NCACTIVATE = 0x0086;
private const int WM_ACTIVATE = 0x0006;
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_NCACTIVATE)
{
if (wParam == new IntPtr(0))
handled = true;
}
if (msg == WM_ACTIVATE)
{
if (wParam == new IntPtr(0))
handled = true;
}
return IntPtr.Zero;
}
ただし、これを行うことにより、
var f = new Window();
f.ShowDialog();
このメインウィンドウ内から作成されている他のすべてのWPFウィンドウがフォーカスを受け取ることはありませんし、彼らが表示されているものの、窓はありませんクライアント領域とWindowsの最小化、最大化、および閉じるボタンの両方でユーザーの入力に反応しません。私は明らかに何か間違ったことをしているので、これを正しい方法で行うためのアドバイスや指針はありますか?
コードはちょうどあなたがそれがない期待し何をしません。単にWPFにメッセージが表示されないようにします。ウィンドウはまだアクティブですが、WPFはそれを認識しません。だから絶望的に混乱します。ウィンドウの非アクティブ化を防止するには、WPFにはない武器が必要です。 –
はい、それは私が期待したものでした。では、これにアプローチするにはどうすればよいでしょうか? – dsfgsho
アプローチ*何*?タスクバーには「スタイル」がありませんので、あなたが解決しようとしている問題は完全には不明です。 WPFはタスクバーの作成を直接サポートしていないので、SHAppBarMessage()をピンボークスで作成します。それはうまくいく。 –