Flash 对话框消息
本文关键字:消息 对话框 Flash | 更新日期: 2023-09-27 18:31:29
如果单击其所有者窗口,标准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;
}
没有一条消息告诉您 Windows 希望您的窗口闪烁。但是,您可以做的是监视Windows用于首先开始闪烁窗口的相同触发器。
当窗口具有已禁用的所有者窗口(设置了WS_DISABLED
样式位)并且用户在禁用窗口的任何部分单击鼠标按钮时,窗口将闪烁。
在内部,这由DefWindowProc
处理,以响应WM_SETCURSOR
消息:
- 如果 lParam 的低阶词是
HTERROR
,并且 - lParam 的高阶词是鼠标按下消息之一(
WM_LBUTTONDOWN
等),并且 - 该窗口有一个已启用的拥有弹出窗口,然后
-
DefWindowProc
将在弹出窗口中调用FlashWindowEx
因此,要确定何时应该自己闪烁对话框的触发器,您所要做的就是与Windows相同的操作。在所有者窗口的窗口过程中,处理WM_SETCURSOR
消息,执行上述三个测试,如果这三个测试都为真,则可以为对话框触发自己的自定义闪烁。当然,在这种情况下,您不会将消息传递回DefWindowProc
进行处理。