1. 程式人生 > >Qt - 檢測軟體執行小程式

Qt - 檢測軟體執行小程式

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



歡迎探討

郵箱:[email protected]
或者在此部落格留言


打賞

如果對您有幫助的話歡迎打賞哦^_^