C# 在启动窗口中处理WM_NCACTIVATE会阻止所有其他窗口

C# 在启动窗口中处理WM_NCACTIVATE会阻止所有其他窗口,c#,wpf,winapi,wndproc,C#,Wpf,Winapi,Wndproc,我试图保持一个特定的WPF窗口处于焦点位置,这意味着它在失去焦点时不应该改变窗口样式(例如,像标准的Windows任务栏)。为了实现这一点,我连接到WndProc以检查WM\u-ACTIVATE或WM\u-ACTIVATE是否设置为false(wParam==0),然后将消息标记为handled=true以阻止窗口处于非活动状态。下面是一些示例代码: void Window_Loaded(object sender, RoutedEventArgs e) { var source = H

我试图保持一个特定的WPF窗口处于焦点位置,这意味着它在失去焦点时不应该改变窗口样式(例如,像标准的Windows任务栏)。为了实现这一点,我连接到
WndProc
以检查
WM\u-ACTIVATE
WM\u-ACTIVATE
是否设置为false(
wParam==0
),然后将消息标记为
handled=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();

从不接收焦点,尽管它们是可见的,但窗口不会对客户端区域以及窗口最小化、最大化和关闭按钮中的用户输入做出反应。我显然做错了什么,所以有没有关于如何正确执行此操作的建议或指针?

即使窗口失去焦点,保持WPF窗口的视觉样式处于活动状态的解决方案是如下处理
WM\u NCACTIVATE

private const uint WM_NCACTIVATE = 0x0086;

private IntPtr WndProc(IntPtr hwnd, int msg, 
         IntPtr wParam, IntPtr lParam, ref bool handled)
{
    var returnvalue = IntPtr.Zero;
    if (msg == WM_NCACTIVATE)
    {
        //replace the wParam (true/false) which indicates 
            //active/inactive with always true
        returnvalue = DefWindowProc(hwnd, WM_NCACTIVATE, 
                     new IntPtr(1), new IntPtr(-1));
        handled = true;
    }
}


[DllImport("user32.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages uMsg, IntPtr wParam, IntPtr lParam);

这段代码并没有达到你所希望的效果。它只是阻止WPF看到消息。窗口仍处于激活状态,但WPF不知道。因此,我感到非常困惑。防止窗口关闭需要一个更大的武器,一个WPF没有的武器。是的,这是我所期望的。那么,有什么更好的方法来解决这个问题呢?解决什么问题?任务栏没有“样式”,所以完全不清楚您要解决的问题。WPF不直接支持创建任务栏,您可以通过pinvoking SHAppBarMessage()创建一个。这很好用。我确实在用ShappArmMessage注册一个新的appbar。我试图做的是禁用注册为appbar的窗口(在我的例子中是WPF窗口)的激活/停用行为。我一直在查看设置
ABM_ACTIVATE
ABM_SETSTATE
,但这些不会改变已注册任务栏的视觉外观。