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 = );
~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( ); // for 100fps OpenServiceManager();
} MainWindow::~MainWindow()
{
delete ui;
CloseServiceHandle(hSCM);
} void MainWindow::scanTable()
{
//进程
for(int row=; row<ui->tableWidget_progress->rowCount(); row++)
for(int col=; 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=; row<ui->tableWidget_service->rowCount(); row++)
for(int col=; 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, , 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\n",pe32.szExeFile);
//printf("进程ID:%u\n\n",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());
}

Qt监控后台服务运行状态的更多相关文章

  1. 使用 pm2-web 监控 pm2 服务运行状态

    pm2-web 是一款 pm2 服务状态监控程序,基于 web . 安装 $ npm install -g pm2-web 运行(默认是在8080端口) $ pm2-web 配置 pm2-web 将会 ...

  2. angular访问后台服务及监控会话超时的封装

    angular访问后台服务及监控会话超时的封装 angular本身自带访问组件http和httpclient,组件本身都是异步模式访问.本文只列举了对http组件的封装同时也一同处理会话超时监控. 获 ...

  3. 基于SignalR实现B/S系统对windows服务运行状态的监测

    通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...

  4. SignalR实现B/S系统对windows服务运行状态的监测

    基于SignalR实现B/S系统对windows服务运行状态的监测 通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windo ...

  5. Nagios监控nginx服务具体过程

    1在nginx 服务器上安装nrpe客户端: Nginx的服务须要监控起来.不然万一down了而不及时修复,会影响web应用.例如以下web应用上面启动的nginx后台进程[root@lb-net-2 ...

  6. Grafana部署监控docker服务

    Grafana部署监控docker服务 一.使用InfluxDB+cAdvisor+Grafana配置Docker监控 1.1Docker监控组件 1.2cAdvisor: 1.3Docker监控安装 ...

  7. iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法

    问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...

  8. 带后台服务配置的tomcat使用

    tomcat服务启动,将不需要手动启动startup.bat,避免cmd窗口的出现,因为隐藏到后台服务执行: 1,下载. 官网:http://tomcat.apache.org/download-70 ...

  9. Android 三级联动选择城市+后台服务加载数据库

    技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...

随机推荐

  1. mybatis深入学习

    最近做的一个活可以让我深入学习一下现在比较流行的ORM框架:mybatis/ibatis的内部原理,SQL的拦截,解析,dataSource和JDBC中做一些额外的事情.如果有可能的话想造一个比较简单 ...

  2. git关联远程仓库命令<原>

    一.存在远程仓库了,本地想克隆其代码: $ git clone git@git.oschina.net:winkey4986/Weather_demo.git 二.本地有代码了,想在建个远程仓库保存代 ...

  3. 【 Linux 】单台服务器上并发TCP连接数

    单台服务器上并发TCP连接数    问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制:    对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...

  4. ggplot2作图详解:入门函数qplot

    ggplot2作图详解:入门函数qplot   ggplot2的功能不用我们做广告,因为它的作者Hadley Wickham就说ggplot2是一个强大的作图工具,它可以让你不受现有图形类型的限制,创 ...

  5. 关于Trie树的模板

    Trie树又称单词查找树,Trie树,是一种树形结构.是一种哈希树的变种.典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串),所以常常被搜索引擎系统用于文本词频统计. 它的长处是:利用字符 ...

  6. android 相机拍照后选择照片编辑,相片编辑界面直线形状会显示锯齿状

    因为 decode 出来的图片太小,小于屏幕.所以,显示的时候 会把图片略微放大,导致直线形状会显示锯齿状.   能够改动getScreenImageSize 方法中的size 的大小,比方能够把13 ...

  7. iOS开发小技巧--取消按钮的选中状态

    首先要自定义按钮,并且实现如下方法,对,就是这么实现!!

  8. ps -a,job,netstat,daemons

     kill         -9是强制      -15是正常后执行 进程中的数据都写到 /proc/*这个目录下 进程 ps -l      aux   -lA   zxjf(进程树) job   ...

  9. npm常用命令汇总

    npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准. 有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install ...

  10. Qt中delete的问题

    最近项目遇到了一个bug,压力测试ui总会崩溃,gdb调试未果,跑到了库函数,无从查起: (gdb)bt #0 0x4146b1e4 in QWidgetPrivate::drawWidget(QPa ...