首页 > 解决方案 > 为什么 WM_NCACTIVATE 消息没有发送到 SizeToContent 设置为 Height 的窗口

问题描述

我写了一个WndProc来知道当前窗口是否在闪烁。如下:

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        var retVal = IntPtr.Zero;

        switch (msg)
        {
            case (int)WindowsMessages.NCACTIVATE:
                retVal = WindowsNative.DefWindowProc(hwnd, WindowsMessages.NCACTIVATE, new IntPtr(1), new IntPtr(-1));
                IsFlashing = (int)wParam == 0;
                break;
        }

        return retVal;
    }

现在这可以完美地与任何东西一起使用,Window除非它们的SizeToContent属性设置为Height(我没有测试过WidthAndHeight,但我认为它也不起作用);在这种情况下,WM_NCACTIVATE消息根本不会发送到Window。我所有的窗口都使用自定义外观(使用 WPF WindowChrome)。你可能知道原因或可以帮助我解决这个问题吗?

标签: c#wpfwinapiwindows-messages

解决方案


理论上,WM_NCACTIVTE消息事件不会无缘无故地被阻塞。

如果可以的话,我建议你重新定义WM_NCACTIVATE.

像这样:</p>

    private const uint WM_NCACTIVATE = 0x0086;

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        var retVal = IntPtr.Zero;

        switch (msg)
        {
            case (int)WindowsMessages.NCACTIVATE:
            retVal = WindowsNative.DefWindowProc(hwnd, WindowsMessages.NCACTIVATE, new IntPtr(1), new IntPtr(-1));
            IsFlashing = (int)wParam == 0;
            break;
        }

    return retVal;
    }

希望能帮到你。


推荐阅读