• Qt监控后台服务运行状态


    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QMap>
    #include <QTimer>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void getAllAppPidList(QMap<QString, qint64> &app_pid);
        void OpenServiceManager();
    private slots:
        void scanTable();
    
        void on_pushButton_add_progress_clicked();
    
        void on_pushButton_add_service_clicked();
    
    private:
        Ui::MainWindow *ui;
        QTimer* scanTimer;
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp

    #include <windows.h>// for OpenService
    #include <tlhelp32.h>// for CreateToolhelp32Snapshot
    #include <Psapi.h>   // for GetModuleFileNameEx
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    /*
     *
     * =================================================================
     * !!!!!!!!!!!!!本程序需要管理员身份运行!!!!!!!!!!!!!!!
     * =================================================================
     *
     * */
    
    //使用带bom的UTF8文件格式,在Tools-Options-Text Editor-Behavior-File Encoding-UTF-8 BOM:Add If Emcoding Is UTF-8
    #pragma execution_character_set("utf-8")
    
    SC_HANDLE hSCM;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        scanTimer = new QTimer(this);
        connect( scanTimer, SIGNAL(timeout()), SLOT(scanTable()) );
        scanTimer->start( 10 );  // for 100fps
    
        OpenServiceManager();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
        CloseServiceHandle(hSCM);
    }
    
    void MainWindow::scanTable()
    {
        //进程
        for(int row=0; row<ui->tableWidget_progress->rowCount(); row++)
            for(int col=0; col<ui->tableWidget_progress->columnCount();col++)
            {
                QTableWidgetItem* item = ui->tableWidget_progress->item(row,col);
                if(item!=NULL)
                {
                    QString app=item->text();
                }
            }
    
        //检测服务是否在运行
        if(hSCM)
        {
            for(int row=0; row<ui->tableWidget_service->rowCount(); row++)
                for(int col=0; col<ui->tableWidget_service->columnCount();col++)
                {
                    QTableWidgetItem* item = ui->tableWidget_service->item(row,col);
                    if(item!=NULL)
                    {
                        QString serviceName=item->text();
                        SC_HANDLE hService = ::OpenService( hSCM, serviceName.toStdWString().data(), SERVICE_ALL_ACCESS );
                        if(hService)
                        {
                            SERVICE_STATUS ssStatus;
                            QueryServiceStatus(hService,&ssStatus);//查看该Service的状态
                            if(ssStatus.dwCurrentState==SERVICE_STOPPED)
                            {
                                ::StartService( hService, 0, NULL );
                                ui->textEdit->append("StartService "+serviceName);
                            }
                            else if(ssStatus.dwCurrentState==SERVICE_RUNNING)
                            {
                                item->setBackground(Qt::green);
                            }
                            CloseServiceHandle(hService);
                        }
                        else
                        {
                            //ui->textEdit->append("OpenService Failed  "+serviceName);
                            item->setBackground(Qt::red);
                        }
                    }
                }
        }
    }
    
    void MainWindow::OpenServiceManager()
    {
        /*
         *
         *
         * 以下服务相关操作需要管理员权限
         *
         *
         *
         * */
        hSCM = ::OpenSCManager(NULL, // local machine
                               NULL, // ServicesActive database
                               SC_MANAGER_ALL_ACCESS); // full access
        if (hSCM) {
            //hService = ::OpenService( hSCM, QString("STEPVR_MMAP_SERVICE").toStdWString().data(), SERVICE_ALL_ACCESS );
            //if(hService==NULL)
            //    ui->textEdit->append("OpenService Failed");
        }
        else
        {
            qDebug()<<"OpenSCManager Fail"<<GetLastError();
            ui->textEdit->append("OpenSCManager Failed");
        }
    }
    
    // 根据进程号获取exe所在文件绝对路径
    /*QString GetPathByProcessID(DWORD pid)
    {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
        if (!hProcess)
        {
            //QMessageBox::warning(NULL,"GetPathByProcessID","无权访问该进程");
            return "";
        }
        WCHAR filePath[MAX_PATH];
        DWORD ret= GetModuleFileNameEx(hProcess, NULL, filePath, MAX_PATH) ;
        QString file = QString::fromStdWString( filePath );
        //QMessageBox::warning(NULL,"GetPathByProcessID ret=", QString::number(ret)+":"+file);
        CloseHandle(hProcess);
        return ret==0?"":file;
    }
    
    // 获取机器上正在运行的全部exe
    void MainWindow::getAllAppPidList(QMap<QString, qint64> &app_pid)
    {
        app_pid.clear();
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(pe32);
        HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if(hProcessSnap == INVALID_HANDLE_VALUE)
        {
            //warningLabel->setText("CreateToolhelp32Snapshot调用失败");
            return ;
        }
        BOOL bMore = Process32First(hProcessSnap,&pe32);
        while(bMore)
        {
            //printf("进程名称:%s
    ",pe32.szExeFile);
            //printf("进程ID:%u
    
    ",pe32.th32ProcessID);
    
            QString exeName = (QString::fromUtf16(reinterpret_cast<const unsigned short *>(pe32.szExeFile)));
            QString exePath = GetPathByProcessID( pe32.th32ProcessID );
            exePath = FORMAT_PATH( exePath );
            //qDebug()<<exePath.toLower();
            if( exePath.isEmpty() )
            {
                //warningLabel->setText("获取进程 " + exeName + " 路径失败");
            }
            else
            {
                app_pid[exePath] = pe32.th32ProcessID;
            }
    
            bMore = Process32Next(hProcessSnap,&pe32);
        }
        CloseHandle(hProcessSnap);
    }*/
    
    void MainWindow::on_pushButton_add_progress_clicked()
    {
        ui->tableWidget_progress->insertRow(ui->tableWidget_progress->rowCount());
    }
    
    void MainWindow::on_pushButton_add_service_clicked()
    {
        ui->tableWidget_service->insertRow(ui->tableWidget_service->rowCount());
    }
  • 相关阅读:
    css3 动画
    jQuery toast 淡入淡出提示
    JavaScript事件——拖拉事件
    Vue -- element-ui 限制只能输入number
    css 移动端页面,在ios中,margin-bottom 没有生效
    django 快速搭建blog
    python 正则表达式口诀
    [转]python os模块 常用命令
    【转】scapy 构造以太网注入帧
    【转】关于Scapy
  • 原文地址:https://www.cnblogs.com/coolbear/p/7144993.html
Copyright © 2020-2023  润新知