Tip16 使用Qt检查扩展屏幕热插拔

本篇主讲讲解如何在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的系统通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值