这个程序可以实现把图片、动图、视频当成壁纸显示在图标图层之下,软件会保存上一次关闭时的选择 重启时恢复,有什么问题评论区看到会回复
有问题欢迎指出,需要编译好的程序 可以私信或留下联系方式发送
废话不多说先上效果再上代码,核心代码我都打上了“关键”两字
静态图片:
动画壁纸:
视频壁纸 带有音频的话可以勾选壁纸音乐:
.pro文件内容
QT += core gui multimediawidgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
RC_ICONS = ../image/tubiao.ico
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
头文件
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
HWND winwallpaper();
HWND winwallpaper_send();
static inline BOOL CALLBACK enumwin(HWND han,LPARAM lp);
void mp4(QString fine); //显示视频
void gif(QString fine); //显示图片
//最小化托盘信号处理
void sys(QSystemTrayIcon::ActivationReason r);
QSystemTrayIcon* system;
//图片、视频类
QLabel* label;
QVideoWidget* vid;
QMediaPlayer* med;
QAudioOutput* aud = new QAudioOutput;
//使用此类记录使用状态
QSettings* ConfigFile;
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
源文件
#include "widget.h"
#include "ui_widget.h"
int if_sum = 1;
HWND win;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
this->setWindowFlags(Qt::FramelessWindowHint);//去掉窗口边框
//this->setWindowTitle("动态壁纸"); //窗口标题 已去掉边框所以没有意义
//this->setWindowIcon(QIcon("image/tubiao.ico")); //窗口图标 已去掉边框所以没有意义
ConfigFile = new QSettings("config.cfg",QSettings::IniFormat);
//最小化托盘类指针
system = new QSystemTrayIcon(this);
ui->setupUi(this);
//动态壁纸按钮信号处理
connect(ui->gifButton,&QPushButton::clicked,this,[=]()
{
//获取文件路径与文件类型过滤器,返回文件路径
QString gifFile = QFileDialog::getOpenFileName(this,"打开动态图片","/","image(*.png *.jpg *.jpeg *.gif)");
//先关掉上一个窗口,不然无法在退出程序时关闭窗口
if(ConfigFile->value("GIF") == "正在使用")
{
label->close();
}
else if(ConfigFile->value("MP4") == "正在使用")
{
vid->close();
}
//将信息写入配置文件,待下次启动时初始化程序
ConfigFile->setValue("GIF","正在使用");
ConfigFile->setValue("GIF图片路径",gifFile);
ConfigFile->setValue("MP4","暂停使用");
//将文件路径传递给自定义图片显示函数
gif(ConfigFile->value("GIF图片路径").toString());
});
//视频壁纸按钮信号处理,同上
connect(ui->mp4Button,&QPushButton::clicked,this,[=]()
{
QString mp4File = QFileDialog::getOpenFileName(this,"打开视频文件","/","MV(*.mp4 *.wav *.mp3)");
if(ConfigFile->value("GIF") == "正在使用")
{
label->close();
}
else if(ConfigFile->value("MP4") == "正在使用")
{
vid->close();
}
ConfigFile->setValue("MP4","正在使用");
ConfigFile->setValue("MP4视频路径",mp4File);
ConfigFile->setValue("GIF","暂停使用");
mp4(ConfigFile->value("MP4视频路径").toString());
});
//最小化托盘右键处理
QAction* show = new QAction("显示",this);
connect(show,&QAction::triggered,this,[=]()
{
this->show();
});
QAction* clos = new QAction("退出",this);
connect(clos,&QAction::triggered,this,[=]()
{
//先关闭所有显示窗口,再关闭主程序,(可优化)退出程序时的小卡顿由此产生
label->close();
vid->close();
this->close();
});
//只有在第一次运行时显示主窗口,往后启动或 自启动将不显示
if(ConfigFile->value("显示窗口") == "否")
{
QTimer::singleShot(100,this,[=]()
{
this->hide();
QMenu* menu = new QMenu(this);
menu->addAction(show);
menu->addAction(clos);
system->setContextMenu(menu);
system->setToolTip("动态壁纸");
system->setIcon(QIcon("image/tubiao.ico"));
system->show();
});
}
ConfigFile->setValue("显示窗口","否");
//右上角隐藏程序按钮大小及图标,下方是此按钮信号处理
ui->closeapp->resize(16,16);
ui->closeapp->setStyleSheet("border-image:url(image/close.png)");
connect(ui->closeapp,&QPushButton::clicked,this,[=]()
{
this->hide();
QMenu* menu = new QMenu(this);
menu->addAction(show);
menu->addAction(clos);
system->setContextMenu(menu);
system->setToolTip("动态壁纸");
system->setIcon(QIcon("image/tubiao.ico"));
system->show();
if(if_sum)
{
system->showMessage("动态壁纸","已隐藏到最小化托盘");
if_sum = 0;
}
});
//最小化托盘左键双击信号处理,功能(显示主窗口)
connect(system,&QSystemTrayIcon::activated,this,&Widget::sys);
//壁纸音乐复选框信号处理
connect(ui->checkBox,&QCheckBox::clicked,this,[=]()
{
if(ui->checkBox->isChecked())
{
aud->setMuted(false); //这个类方法是实现实时开关音乐的关键
ConfigFile->setValue("壁纸音乐","开启");
}
else
{
aud->setMuted(true);
ConfigFile->setValue("壁纸音乐","关闭");
}
});
//使用上一次关闭时的参数初始化程序
if(ConfigFile->value("壁纸音乐") == "开启")
{
ui->checkBox->setChecked(true);
}
if(ConfigFile->value("MP4") == "正在使用")
{
mp4(ConfigFile->value("MP4视频路径").toString());
}
if(ConfigFile->value("GIF") == "正在使用")
{
gif(ConfigFile->value("GIF图片路径").toString());
}
}
Widget::~Widget()
{
delete ui;
}
/*
* 下方三个方法都是实现壁纸的关键
* 1.获取桌面最顶层窗口句柄
* 2.发送信号至桌面最顶层窗口
* 3.遍历WorkerW窗口
*/
HWND Widget::winwallpaper()
{
HWND hwnd = ::FindWindow(L"Progman",NULL);
return hwnd;
}
HWND Widget::winwallpaper_send()
{
int result;
HWND hwnd = ::FindWindow(L"Progman",NULL);
SendMessageTimeout(hwnd,0x52c,0,0,SMTO_NORMAL,0x3e8,(PDWORD_PTR)&result);
return hwnd;
}
WINBOOL Widget::enumwin(HWND han, LPARAM lp)
{
HWND def = ::FindWindowEx(han,0,L"SHELLDLL_DefView",NULL);
if(def!= 0)
{
win = FindWindowEx(0,han,L"WorkerW",0);
}
return true;
}
//关键代码!将窗口至于桌面最顶层窗口之下,随后播放多媒体
void Widget::mp4(QString fine)
{
winwallpaper_send();
EnumWindows(enumwin,(LPARAM)NULL);
ShowWindow(win,SW_HIDE);
vid = new QVideoWidget;
med = new QMediaPlayer;
med->setVideoOutput(vid);
vid->setWindowState(Qt::WindowMaximized);
vid->setWindowFlags(Qt::FramelessWindowHint);
vid->showFullScreen();
med->setSource(QUrl::fromLocalFile(fine));
med->setLoops(QMediaPlayer::Infinite);
aud->setMuted(true);
med->setAudioOutput(aud);
if(ConfigFile->value("壁纸音乐") == "开启")
{
aud->setMuted(false);
}
med->play();
SetParent((HWND)vid->winId(),winwallpaper());
vid->show();
}
//关键代码!将窗口至于桌面最顶层窗口之下,随后显示图片
void Widget::gif(QString fine)
{
winwallpaper_send();
EnumWindows(enumwin,(LPARAM)NULL);
ShowWindow(win,SW_HIDE);
QMovie* movie = new QMovie(fine);
label = new QLabel;
label->setWindowState(Qt::WindowMaximized);
label->setWindowFlags(Qt::FramelessWindowHint);
label->setMovie(movie);
label->setScaledContents(true);
movie->start();
SetParent((HWND)label->winId(),winwallpaper());
label->show();
}
void Widget::sys(QSystemTrayIcon::ActivationReason r)
{
if(r == QSystemTrayIcon::DoubleClick)
{
this->show();
}
}