【问题标题】:Why isn't WM_NCACTIVATE message sent to a Window with its SizeToContent set to Height为什么 WM_NCACTIVATE 消息没有发送到 SizeToContent 设置为 Height 的窗口
【发布时间】:2019-04-14 16:43:21
【问题描述】:

我写了一个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)。您可能知道原因或可以帮助我解决这个问题吗?

【问题讨论】:

  • 不知道你有没有注意到MSDN中提示SizeToContent,当窗口托管在浏览器中时,你无法设置或获取该属性。
  • @StriveSun-MSFT:托管在浏览器中?我不是指浏览器 Chrome,我指的是 WPF WindowChrome。

标签: c# wpf winapi windows-messages


【解决方案1】:

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

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

像这样:

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

希望能帮到你。

【讨论】:

  • 那么你是说这个问题是因为常数?我不这么认为:NCACTIVATE = 0x0086
  • 一定是因为SizeToContent的某些API调用或行为。
  • @Javid 就你贴的代码而言,至少回调函数没有问题。
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多