【问题标题】:Handle flash window event处理闪烁窗口事件
【发布时间】:2019-04-03 05:46:43
【问题描述】:
在 Windows 上,当父(主)窗口被任何模式对话框阻止时,单击主窗口会产生对话框闪烁。默认情况下,此行为适用于 Windows 操作系统。据我了解,手动可以通过 WinApi 的 FlashWindow 函数或 Qt 的 QApplication::alert 来实现。
有没有办法在模态对话框中处理这个事件?特别是我想在对话框中添加一些额外的操作。我对 Qt 方式的解决方案很感兴趣,但也使用了 WinApi 方式。当对话框闪烁时,尝试通过QObject::eventFilter 处理事件不会产生任何事件。
【问题讨论】:
标签:
c++
windows
qt
winapi
【解决方案1】:
您需要将Qwidget::nativeEvent 与检查模式对话框QApplication::activeModalWidget 结合使用
例如,在模态窗口的父级中检查鼠标按钮。
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = static_cast<MSG*>(message);
if (msg->message == WM_SETCURSOR) {
QWidget* w = qApp->activeModalWidget();
if (w) {
WORD mouseMsg = (msg->lParam >> 16);
if (mouseMsg == WM_LBUTTONDOWN) {
qDebug() << "Click outside";
}
}
}
return false;
}
【解决方案2】:
基于 Serhiy Kulish 的 answer,我使用了 nativeEvent 函数重载,但用于对话框窗口类(不适用于主窗口):
#include <windows.h>
bool MyDialog::nativeEvent(const QByteArray&, void* message, long*)
{
const auto msg = static_cast<MSG*>(message);
if (msg->message == WM_NCACTIVATE)
{
if (msg->wParam == TRUE) { ... } // dialog become active while blinking
else { ... } // dialog become inactive while blinking
}
return false;
}
Windows 中的窗口闪烁是作为一系列WM_NCACTIVATE 消息实现的,其中wParam 设置为FALSE 和TRUE。