本篇主讲讲解如何在Windows环境中使用Qt检测扩展屏幕热插拔操作
操作步骤
在基于QWidget的类中重写nativeEvent事件(理论上不局限QWiget类,但凡有窗口显示即可)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "DeviceDetection.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);
private:
Ui::Widget *ui;
int screenNum = 1;
};
#endif // WIDGET_H
在nativeEvent中判断设备变化通知,并检测屏幕的数量
#include "widget.h"
#include "ui_widget.h"
#include <windows.h>
#include <Dbt.h>
#include <QApplication>
#include <QScreen>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
screenNum = QGuiApplication::screens().count();
}
Widget::~Widget()
{
delete ui;
}
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if(eventType == QByteArray("windows_generic_MSG"))
{
MSG *pMsg = reinterpret_cast<MSG*>(message);
if(pMsg->message == WM_DEVICECHANGE)
{
auto screens = QGuiApplication::screens();
if(screenNum != screens.count())
{
if(screens.count() > screenNum)
{
qDebug() << u8"检测到扩展屏加入";
}else
{
qDebug() << u8"检测到扩展屏移除";
}
screenNum = screens.count();
}
}
}
return false;
}
注意事项
此处Qt使用的是QGuiApplication::screens()来检测窗口数量,当窗口隐藏时,此接口不能正确给出屏幕数量;
解决方案
如果需要窗口隐藏,且能够正确检测到实时的屏幕数量,可以这样临时处理,如果大家有更好的解决方案,欢迎评论留言;
setWindowFlag(Qt::Tool); //使窗口不在任务栏中显示
setGeometry(-100, -100, 1, 1);//将窗体移动到界面之外
show();//展示窗体,使其能够接收到Windows的系统通知