QT 实现开机自启动 程序添加上任务栏托盘图标和退出

// 程序开机自动启动
void setAutostart()
{
    HKEY hKey;
    QString strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

    if (RegOpenKeyEx(HKEY_CURRENT_USER,
                     L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
                     0,
                     KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS){
        TCHAR strExeFullDir[MAX_PATH];
        GetModuleFileName(NULL, strExeFullDir, MAX_PATH);

        TCHAR strDir[MAX_PATH] = {};
        DWORD nLength = MAX_PATH;
        // back_time 是需要设置开机自启动应用程序的名称
        long result = RegGetValue(hKey, nullptr, L"back_time", RRF_RT_REG_SZ, 0, strDir, &nLength);

        if (result != ERROR_SUCCESS || _tcscmp(strExeFullDir, strDir) != 0)
        {
            RegSetValueEx(hKey, L"back_time", 0, REG_SZ, (LPBYTE)strExeFullDir, (lstrlen(strExeFullDir) + 1)*sizeof(TCHAR));

            RegCloseKey(hKey);
        }
    }else{
        QMessageBox::warning(0, QString::fromLocal8Bit("警告"), QString::fromLocal8Bit("\n系统参数错误,不能随系统启动n"));
    }
}

// 取消开机自动启动
void cancelAutoStart()
{
        HKEY hKey;
        QString strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
        if (RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS){
            RegDeleteValue(hKey, L"back_time");
            RegCloseKey(hKey);
        }
}

1、关闭程序保持后台

重写关闭事件,忽略点击窗口关闭

void MainWindow::closeEvent(QCloseEvent *event)
{
    // 隐藏窗口,而不是真正关闭
    setVisible(false);

    // 忽略关闭事件,阻止窗口真正关闭
    event->ignore();
}

2、添加任务栏托盘图标 

// 创建系统托盘图标对象
  QSystemTrayIcon* pSystemTray = new QSystemTrayIcon(&w);

  // 判断系统托盘图标是否创建成功
  if (NULL != pSystemTray) {
    // 设置托盘图标
    pSystemTray->setIcon(QIcon(":/res/totle.svg"));

    // 设置托盘图标的提示信息
    pSystemTray->setToolTip("别坐着了");

    // 显示托盘图标
    pSystemTray->show();
  }

  // ---------- 创建托盘菜单 ----------

  // 创建托盘菜单对象
  auto* trayMenu = new QMenu(&w);

  // 创建“显示面板”菜单项
  auto* showPanelAction = new QAction("显示面板", &w);

  // 连接菜单项的触发信号与主窗口的showPanel槽函数
  QObject::connect(showPanelAction,&QAction::triggered,&w,&MainWindow::showPanel);

  // 将菜单项添加到托盘菜单中
  trayMenu->addAction(showPanelAction);

  // 创建“退出”菜单项
  auto* quitAction = new QAction("退出",&w);

  // 连接菜单项的触发信号与 QApplication 的 quit() 槽函数
  QObject::connect(quitAction,&QAction::triggered,&w,&QApplication::quit);

  // 将菜单项添加到托盘菜单中
  trayMenu->addAction(quitAction);

  // 设置托盘图标的上下文菜单
  pSystemTray->setContextMenu(trayMenu);

  // 显示托盘图标
  pSystemTray->show();

3、完整代码

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
int main(int argc, char *argv[])
{
  // 创建 Qt 应用程序对象
  QApplication a(argc, argv);

  // 创建主窗口对象
  MainWindow w;

  // ---------- 设置任务栏托盘图标 ----------

  // 创建系统托盘图标对象
  QSystemTrayIcon* pSystemTray = new QSystemTrayIcon(&w);

  // 判断系统托盘图标是否创建成功
  if (NULL != pSystemTray) {
    // 设置托盘图标
    pSystemTray->setIcon(QIcon(":/res/totle.svg"));

    // 设置托盘图标的提示信息
    pSystemTray->setToolTip("别坐着了");

    // 显示托盘图标
    pSystemTray->show();
  }

  // ---------- 创建托盘菜单 ----------

  // 创建托盘菜单对象
  auto* trayMenu = new QMenu(&w);

  // 创建“显示面板”菜单项
  auto* showPanelAction = new QAction("显示面板", &w);

  // 连接菜单项的触发信号与主窗口的showPanel槽函数
  QObject::connect(showPanelAction,&QAction::triggered,&w,&MainWindow::showPanel);

  // 将菜单项添加到托盘菜单中
  trayMenu->addAction(showPanelAction);

  // 创建“退出”菜单项
  auto* quitAction = new QAction("退出",&w);

  // 连接菜单项的触发信号与 QApplication 的 quit() 槽函数
  QObject::connect(quitAction,&QAction::triggered,&w,&QApplication::quit);

  // 将菜单项添加到托盘菜单中
  trayMenu->addAction(quitAction);

  // 设置托盘图标的上下文菜单
  pSystemTray->setContextMenu(trayMenu);

  // 显示托盘图标
  pSystemTray->show();

  // 进入应用程序事件循环
  return a.exec();
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMessageBox>
#include <QMainWindow>
#include <QCloseEvent>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public slots:
    void showPanel();
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void closeEvent(QCloseEvent *event);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::closeEvent(QCloseEvent *event)
{
    // 隐藏窗口,而不是真正关闭
    setVisible(false);

    // 忽略关闭事件,阻止窗口真正关闭
    event->ignore();
}

void MainWindow::showPanel()
{
    // 显示窗口
    this->show();

    // 将窗口置顶,确保其显示在最前面
    this->raise();(
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值