6

特定の WPF ウィンドウをフォーカスしたままにしようとしています。つまり、フォーカスを失ったときにウィンドウ スタイルを変更すべきではありません (たとえば、標準の Windows タスクバーなど)。これを実現するために、 にフックしてorが false ( ) に設定されているWndProcかどうかを確認し、ウィンドウが非アクティブになるのをブロックするようにメッセージをマークします。コード例を次に示します。WM_NCACTIVATEWM_ACTIVATEwParam == 0handled = true;

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;
}

ただし、これを行うことで、このメイン ウィンドウ内から作成される他のすべての WPF ウィンドウは、

var f = new Window();
f.ShowDialog();

フォーカスを受け取ることはなく、ウィンドウは表示されますが、クライアント領域だけでなく、Windows の最小化、最大化、閉じるボタンのユーザー入力にも反応しません。私は明らかに何か間違ったことをしているので、これを正しい方法で行うためのアドバイスや指針はありますか?

4

1 に答える 1