3

如果单击其所有者窗口,标准 Windows 对话框将闪烁。效果类似于激活和停用窗口。

但是,在我的对话框上实现自定义窗口边框时,我不知道何时应该闪烁窗口。Windows 不会为我闪烁对话框。

这是我尝试过的:

  • 我查看了发送给所有者和对话框的所有消息,但找不到任何仅用于告诉窗口闪烁的消息。

  • 我将 Spy++ 连接到默认的 Windows 对话框,但也找不到“flash”消息。

在 WinUser.h 中我找不到“flash”消息,所以我假设它是一个或多个消息与指定的 lParam 和 wParam 的某种组合。

有没有人有这方面的经验,或者可以指出一些解释这一点的页面?任何想法都值得赞赏,因为我已经研究这个问题几个月了。

编辑

作为对评论的回应,这里是我目前使用的代码:

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x0020)
    {
        if ((short)((long)lParam & 0xffff) == (-2))
        {
            short hiword = (short)((((long)lParam) >> 16) & 0xffff);

            if (hiword == 0x0201 || hiword == 0x0204)
                Flash(); // My function which simulates a window flash
        }
    }

    return IntPtr.Zero;
}
4

1 回答 1

6

没有消息告诉您 Windows 希望您的窗口闪烁。但是,您可以做的是注意 Windows 用来开始闪烁窗口的相同触发器。

当您的窗口具有禁用的所有者窗口(设置WS_DISABLED样式位)并且用户在禁用窗口的任何部分单击鼠标按钮时,您的窗口将闪烁。

在内部,这是由DefWindowProc响应WM_SETCURSOR消息处理的:

  • 如果 lParam 的低位词是HTERROR, 并且
  • lParam 的高位词是鼠标按钮按下消息之一(WM_LBUTTONDOWN等),并且
  • 该窗口有一个启用的拥有弹出窗口,然后
  • DefWindowProc将调用FlashWindowEx弹出窗口

因此,要确定何时应该自己闪烁对话框的触发器,您所要做的就是与 Windows 一样。在所有者窗口的窗口过程中,处理WM_SETCURSOR消息,执行上述三个测试,如果三个都为真,那么您可以为您的对话框触发您自己的自定义闪烁。当然,在这种情况下,您不会将消息传回DefWindowProc处理。

于 2013-09-15T01:44:41.083 回答