Flash对话框消息

时间:2013-09-14 23:41:41

标签: c# winapi pinvoke

如果单击其所有者窗口,标准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;
}

1 个答案:

答案 0 :(得分:5)

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

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

在内部,这由DefWindowProc处理,以回复WM_SETCURSOR消息:

  • 如果lParam的低位字是HTERROR
  • lParam的高位字是鼠标按键消息之一(WM_LBUTTONDOWN等),
  • 该窗口具有已启用的自带弹出窗口,然后
  • DefWindowProc将在弹出窗口中调用FlashWindowEx

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