Qt - 检测软件运行小程序

36 篇文章 8 订阅
12 篇文章 0 订阅

Qt - 检测软件运行小程序

GitHub:https://github.com/LJJ931026/MonitorStartup.git

  • 摘要
  • Qt创建一个Qt工程
  • 使用一个线程来检测软件是否启动
  • 线程间使用信号与槽进行通信
  • 利用tasklist命令来判断

描述

此软件适用于检测外部软件是否处于运行状态,如果没有运行则启动该外部软件

说明

软件详细参数 

属性
名称MonitorStartup
开发环境QT5.2
开发时间2017-12-27
开发人LJJ




图片展示

主界面:

界面中选择应用程序的路径或者程序名,直接点击开始监控即可,文本框显示实时信息。

主界面


退出提示:
主界面


运行时界面显示:



最小化托盘时信息提示:



右击托盘图标菜单:




代码块

线程中代码:
void MonitorSaftware::run()
{
    static long cnt = 0;
    QProcess StartSW(this);
    QStringList pn = PathName.split("/");
    foreach (QString tmp, pn) {
        if(!tmp.contains(".exe")) continue;
        Name += tmp;
        break;
    }
    msleep(3000);
    while (1)
    {
        /*
         * startDetached()中的程序路径必须"D:/software/wireShark/Wireshark.exe"或者"D:\\software\\wireShark\\Wireshark.exe"
         * 注:或者配置程序的环境变量, 直接填写程序名称即可:cmd.exe
         * 注:程序后面不加后缀也是可以的, "D:/software/wireShark/Wireshark"
         * 注:如果路径中带有空格是不能启动程序的
         * 注:如果路径中有空格,那个可以带参数便可以使用
         * 注:建议使用路径方式(获取是否运行信息时只能使用这种方式):"D:/Anke - LJJ/Project/微震联合定位/采集软件/UnionSample/UnionSample/Release/UnionSample.exe";
         * 注:这个需要在线程中实现,不能在注进程中写
         */
        QString str = QString("第%1次检测").arg(cnt);
        if(PathName == "") continue;
        if(!PathName.contains(".exe")) continue;
        if(Name == "") continue;
        if(!Name.contains(".exe")) continue;
        QString cmd = "tasklist";
        QStringList arg;
        arg << "-fi" << Name;
        StartSW.start(cmd, arg);
        StartSW.waitForFinished();
        QString info = QString::fromLocal8Bit(StartSW.readAllStandardOutput());
        // 根据返回内容判断外部软件是否在运行
        if(info.contains("没有运行的任务匹配指定标准")){
            // 表示没有运行,启动该软件
            StartSW.startDetached(PathName, QStringList(PathName));
            emit sendMsg(str + ", 没有见到程序运行,正在开启程序...");
        }
        else {
            qDebug() << "程序已经在运行!";
            emit sendMsg(str + ", 程序已经在运行...");
        }

        if(isExit)
            break;
        msleep(5000);
        cnt++;
    }
}
主程序中代码:
// 监控
void Widget::on_pushButton_monitor_clicked()
{
    QString path = ui->lineEdit->text();
    // 判断要检测的程序路径是否为空
    if(path == "") {
        QMessageBox::information(NULL, QString("提示"), QString("路径不能为空,请选择路径!"));
        return;
    }
    // 再次判断是否含有应用程序
    if(!path.contains(".exe")) {
        QMessageBox::information(NULL, QString("提示"), QString("路径错误,请检查!"));
        return;
    }
    if(ui->pushButton_monitor->text() == "开始监控") {
        mthread.start();
        emit sendMsg(path);
        emit sendMsg("monitor");
        ui->pushButton_monitor->setText("停止监控");
        ui->lineEdit->setEnabled(false);
        ui->pushButton_open->setEnabled(false);
    }
    else {
        emit sendMsg("exit");
        ui->pushButton_monitor->setText("开始监控");
        ui->lineEdit->setEnabled(true);
        ui->pushButton_open->setEnabled(true);
    }
}

最小化托盘代码:
void Widget::closeEvent(QCloseEvent *e)
{
    if(QMessageBox::information(NULL, QString("提示"), QString("是否最小化托盘?\n\n选择是最小化托盘,选择否退出"),
                    QMessageBox::Ok | QMessageBox::No) == QMessageBox::Ok) {
        e->ignore();
        MiniTray();
    }
    else {
        e->accept();
    }
}

void Widget::MiniTray()
{
    this->hide();

    QIcon icon = QIcon(":/icon/Monitor.png");
    mSysTrayIcon.setIcon(icon); //将icon设到QSystemTrayIcon对象中
    mSysTrayIcon.setToolTip("检测软件启动"); //当鼠标移动到托盘上的图标时,会显示此处设置的内容
    mSysTrayIcon.show(); //在系统托盘显示此对象
    mSysTrayIcon.showMessage("提示", "点击显示界面");
    CreateMenu(); // 创建菜单

    connect(&mSysTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
            this, SLOT(ActivateSystemTray(QSystemTrayIcon::ActivationReason)));
}

// 右击最小化托盘菜单代码:
void Widget::CreateMenu()
{
    MainFace = new QAction("主界面", this);
    connect(MainFace, SIGNAL(triggered()), this, SLOT(MainInterface()));

    Exit = new QAction("退出", this);
    connect(Exit, SIGNAL(triggered()), this, SLOT(ExitProgram()));

    menu = new QMenu(this);
    menu->addAction(MainFace);
    menu->addAction(Exit);
    mSysTrayIcon.setContextMenu(menu);
}



欢迎探讨

邮箱:lijiangjun931026@outlook.com
或者在此博客留言


打赏

如果对您有帮助的话欢迎打赏哦^_^


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值