网上有很多山寨方法,但是以下方法是最可靠的。不过目前网上的例子都是MFC版本。下面是QT的版本。
文件:wdget.h的代码
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <windows.h>
namespace Ui {
class Widget;
}
#define UM_APPBARID WM_USER + 1
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
bool nativeEvent(const QByteArray &eventType, void *message, long *result)override;
private:
Ui::Widget *ui;
APPBARDATA m_abd;
};
#endif // WIDGET_H
文件:wdget.cpp的代码
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
memset(&m_abd, 0, sizeof(APPBARDATA));
m_abd.cbSize = sizeof(APPBARDATA);
m_abd.hWnd = (HWND)this->winId();
m_abd.uCallbackMessage = UM_APPBARID;
::SHAppBarMessage(ABM_NEW, &m_abd);
}
Widget::~Widget()
{
delete ui;
}
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = (MSG *)message;
if(msg->message == UM_APPBARID)
{
switch ((UINT)msg->wParam)
{
case ABN_FULLSCREENAPP:
{
if (TRUE == (BOOL)msg->lParam)
{
qDebug()<<"进入全屏";
}
else
{
qDebug()<<"退出全屏";
}
}
break;
default:
break;
}
}
return false;
}
这里有一个细节,假如你多个显示器。比如你有显示器1,显示器2。这时候,如果你的检测程序在显示器1,而显示器2 有个软件进入全屏状态。那么显示器1的检测程序是不会收到全屏消息的。只有它们在同一个显示器,才会收到全屏消息。