C\C++ Qt开发的动态桌面壁纸程序

这个程序可以实现把图片、动图、视频当成壁纸显示在图标图层之下,软件会保存上一次关闭时的选择 重启时恢复,有什么问题评论区看到会回复

有问题欢迎指出,需要编译好的程序 可以私信或留下联系方式发送

废话不多说先上效果再上代码,核心代码我都打上了“关键”两字

静态图片:

动画壁纸:

视频壁纸 带有音频的话可以勾选壁纸音乐:

.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 <QWidget>
#include <QMenu>
#include <QMovie>
#include <QTimer>
#include <qlabel.h>
#include <QSettings>
#include <windows.h>
#include <QFileDialog>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QSystemTrayIcon>

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();
    }

}

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值