1.widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <windows.h>
#include <tlhelp32.h>
#include <QTableWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public:
void showProcess();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
2.widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->tableWidget->setSelectionMode(QTableWidget::SingleSelection);
ui->tableWidget->setSelectionBehavior(QTableWidget::SelectRows);
showProcess();
}
Widget::~Widget()
{
delete ui;
}
void Widget::showProcess()
{
//获取进程信息的链表
HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hsnapShot == INVALID_HANDLE_VALUE)return;
//获取链表的头
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
BOOL bFlag = Process32First(hsnapShot,&pe);
QString str;
int i = 0;
while(bFlag)
{
str = QString::fromWCharArray(pe.szExeFile);
ui->tableWidget->setItem(i,0,new QTableWidgetItem(str));
str = QString::number(pe.th32ProcessID);
ui->tableWidget->setItem(i,1,new QTableWidgetItem(str));
str = QString::number(pe.cntThreads);
ui->tableWidget->setItem(i,2,new QTableWidgetItem(str));
//遍历链表
bFlag = Process32Next(hsnapShot,&pe);
i++;
}
}
void Widget::on_pushButton_clicked()
{
//获取当前选择项 id
QList<QTableWidgetItem*> lstitem = ui->tableWidget->selectedItems();
QTableWidgetItem* pItem = lstitem.front();
//获取选中行
int nrow = ui->tableWidget->row(pItem);
lstitem.pop_front();
pItem = lstitem.front();
lstitem.pop_front();
QString strid = pItem->text();
if(strid.isEmpty())return;
//获取句柄
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE,0,strid.toInt());
//杀死进程
if(hProcess)
{
TerminateProcess(hProcess,-1);
ui->tableWidget->removeRow(nrow);
}
}
3.
4.输出: