zoukankan      html  css  js  c++  java
  • 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());
    }
  • 相关阅读:
    /etc/sysctl.conf 控制内核相关配置文件
    python 并发编程 非阻塞IO模型
    python 并发编程 多路复用IO模型
    python 并发编程 异步IO模型
    python 并发编程 阻塞IO模型
    python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
    python 并发编程 基于gevent模块实现并发的套接字通信
    python 并发编程 io模型 目录
    python 并发编程 socket 服务端 客户端 阻塞io行为
    python 并发编程 IO模型介绍
  • 原文地址:https://www.cnblogs.com/coolbear/p/7144993.html
Copyright © 2011-2022 走看看