处理闪烁窗口事件
Handle flash window event
在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
被设置为FALSE
和TRUE
。
相关文章:
- 处理闪烁窗口事件
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- Qt将鼠标移动事件转移到新窗口
- Wxwidgets - 如何添加调整大小事件处理程序以使"X"绘图随窗口调整大小?
- FLTK:窗口在 MacOS 上获得焦点时的事件
- C++ winAPI 无法处理子窗口事件
- 将输入事件发送到窗口
- 如何添加事件以退出窗口
- 无法从窗口获取 SDL2 事件
- XCB_POLL_FOR_EVENT未检测到关闭窗口的XCB_CLIENT_MESSAGE事件
- Xdamage:获取窗口内容更改的事件
- 如果窗口服务被杀,如何处理事件
- 有没有办法接收有关在窗口中启动的进程的事件
- 哪个事件属于qt c ++中的窗口焦点更改
- 将鼠标事件发送到虚拟现实OpenGL场景中的QtQuick窗口
- SFML FPS访问窗口事件的问题
- SDL视频显示窗口:如何连接窗口关闭事件回调
- 如何处理 WXWIDGETS 中父窗口的鼠标事件
- 如何将事件处理程序添加到桌面窗口
- 窗口创建错误 - 可能是事件处理