处理闪烁窗口事件

Handle flash window event

本文关键字:事件 窗口 闪烁 处理      更新时间:2023-10-16

在Windows上,当父(主(窗口被任何模式对话框阻止时,单击主窗口会产生对话框闪烁。默认情况下,此行为适用于Windows操作系统。据我所知,这可以通过WinApi的FlashWindow函数或Qt的QApplication::alert手动实现。

有没有办法在模式对话框中处理这个事件?我特别想在对话框中添加一些额外的操作。我对Qt方式的解决方案很感兴趣,但WinApi方式也很合适。当对话框闪烁时,尝试通过QObject::eventFilter处理事件不会产生任何事件。

您需要将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;
}

根据Serhiy Kulish的回答,我使用了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被设置为FALSETRUE