Qt - 检测软件运行小程序

Qt - 检测软件运行小程序

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

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

描述

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

说明

软件详细参数 

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




图片展示

主界面:

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

Qt - 检测软件运行小程序_第1张图片


退出提示:
Qt - 检测软件运行小程序_第2张图片


运行时界面显示:
Qt - 检测软件运行小程序_第3张图片


最小化托盘时信息提示:



右击托盘图标菜单:




代码块

线程中代码:
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);
}



欢迎探讨

邮箱:[email protected]
或者在此博客留言


打赏

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


Qt - 检测软件运行小程序_第4张图片Qt - 检测软件运行小程序_第5张图片

你可能感兴趣的:(作品,QT,c++)