【问题标题】: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 设置为FALSETRUE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 2014-05-17
        • 2011-02-03
        • 2011-09-06
        • 2011-12-13
        • 2013-09-17
        • 2011-10-28
        相关资源
        最近更新 更多