Qt - 檢測軟體執行小程式
阿新 • • 發佈:2018-12-28
Qt - 檢測軟體執行小程式
- 摘要
- 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]
或者在此部落格留言
打賞
如果對您有幫助的話歡迎打賞哦^_^