处理Flash窗口事件

时间:2018-10-30 08:18:22

标签: c++ windows qt winapi

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

是否可以在模式对话框中处理此事件?特别是我想向对话框添加一些额外的操作。我对Qt-way解决方案感兴趣,但是WinApi-way也适用。对话框闪烁时,尝试通过QObject::eventFilter处理事件不会产生任何事件。

2 个答案:

答案 0 :(得分:2)

您需要结合使用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;
}

答案 1 :(得分:1)

基于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设置为FALSETRUE