日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

Qt:Windows编程—Qt实现进程管理

發(fā)布時(shí)間:2025/3/15 windows 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt:Windows编程—Qt实现进程管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

繼續(xù)學(xué)window編程,學(xué)呀學(xué)呀 學(xué)無(wú)止境,學(xué)到Windows進(jìn)程相關(guān)API了。利用相關(guān)的API使用Qt寫界面實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的進(jìn)程管理。主要用到 進(jìn)程的創(chuàng)建、進(jìn)程的枚舉、線程的枚舉、DLL的枚舉、進(jìn)程提權(quán)等功能。相關(guān)API的介紹可以看 C/C++:Windows編程—?jiǎng)?chuàng)建進(jìn)程、終止進(jìn)程、枚舉進(jìn)程、枚舉線程、枚舉DLL

界面

先看看qt寫的界面吧。

代碼

創(chuàng)建進(jìn)程

// 創(chuàng)建進(jìn)程 void Widget::on_pushButton_6_clicked() {QFileDialog *fileDialog = new QFileDialog(this);fileDialog->setWindowTitle(tr("打開可執(zhí)行文件"));fileDialog->setDirectory(".");fileDialog->setNameFilter(tr("可執(zhí)行文件(*.exe)"));fileDialog->setViewMode(QFileDialog::Detail);QStringList fileNames;if(fileDialog->exec()){QString fileName;fileNames = fileDialog->selectedFiles();}QString exePath = fileNames[0];qDebug() << exePath;const char* path = exePath.toStdString().c_str();STARTUPINFOA startInfo = {0};startInfo.cb = sizeof(startInfo);PROCESS_INFORMATION processInfo = {0};// startInfo 和 processInfo必須初始化BOOL ret = CreateProcessA(path,NULL,NULL,NULL,false,NULL,NULL,NULL,&startInfo,&processInfo);if( ret ){qDebug() << "processId = " << processInfo.dwProcessId << ",threadId = "<< processInfo.dwThreadId ;CloseHandle( processInfo.hProcess );CloseHandle( processInfo.hThread );emit refreshProcTab();}else{qDebug() << "創(chuàng)建進(jìn)程失敗" ;}}

結(jié)束進(jìn)程

// 結(jié)束進(jìn)程 void Widget::on_pushButton_clicked() {int row = ui->processTab->currentRow();uint pid = getPid();HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); // 獲取進(jìn)程句柄if( hProc == NULL){qDebug() << "OpenProcess error ";return;}BOOL ret = TerminateProcess(hProc,0); // 強(qiáng)制進(jìn)程退出if(ret == FALSE){qDebug() << "TerminateProcess error ";return ;}ui->processTab->removeRow(row);CloseHandle(hProc); }

停止進(jìn)程

// 停止進(jìn)程,就是將進(jìn)程中的所有線程掛起 void Widget::on_pushButton_2_clicked() {uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}THREADENTRY32 entry = {0};entry.dwSize = sizeof(entry);BOOL ret = Thread32First(snapHandele,&entry);while( ret ){if( entry.th32OwnerProcessID == pid){HANDLE tHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,entry.th32ThreadID);if( tHandle == NULL){qDebug() << "OpenThread error,threadId = " << entry.th32ThreadID;}else{DWORD ret = SuspendThread(tHandle);if( ret == -1){qDebug() << "SuspendThread error";}else{qDebug() << "SuspendThread success";}CloseHandle(tHandle);}}ret = Thread32Next(snapHandele,&entry);}CloseHandle(snapHandele); }

恢復(fù)進(jìn)程

// 恢復(fù)進(jìn)程,就是將進(jìn)程中的所有線程恢復(fù) void Widget::on_pushButton_3_clicked() {uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}THREADENTRY32 entry = {0};entry.dwSize = sizeof(entry);BOOL ret = Thread32First(snapHandele,&entry);while( ret ){if( entry.th32OwnerProcessID == pid){HANDLE tHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,entry.th32ThreadID);if( tHandle == NULL){qDebug() << "OpenThread error,threadId = " << entry.th32ThreadID;}else{DWORD ret = ResumeThread(tHandle);if( ret == -1){qDebug() << "SuspendThread error";}else{qDebug() << "ResumeThread success";}CloseHandle(tHandle);}}ret = Thread32Next(snapHandele,&entry);} }

查看DLL

// 查看進(jìn)程的DLL // 查看某些系統(tǒng)進(jìn)程的DLL是不行的,調(diào)用CreateToolhelp32Snapshot直接失敗 // 必須提權(quán),提權(quán)操作在upRole函數(shù)中 void Widget::on_pushButton_4_clicked() {// 清空表格int rowCount = ui->dllTab->rowCount();for( int i = 0; i < rowCount; i++ ){ui->dllTab->removeRow(0);}uint pid = getPid();HANDLE snapHandele = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE ,pid);if( INVALID_HANDLE_VALUE == snapHandele){qDebug() << "CreateToolhelp32Snapshot error" ;return;}MODULEENTRY32 entry = {0};entry.dwSize = sizeof(entry);// 長(zhǎng)度必須賦值BOOL ret = Module32First(snapHandele,&entry);int i = 0;while (ret) {QString dllFile = QString::fromWCharArray(entry.szModule);QString dllPath = QString::fromWCharArray(entry.szExePath);ui->dllTab->insertRow(i);ui->dllTab->setItem(i,0,new QTableWidgetItem(dllFile));ui->dllTab->setItem(i,1,new QTableWidgetItem(QString("%1").arg(dllPath)));i++;ret = Module32Next(snapHandele,&entry);}CloseHandle(snapHandele); }

完整工程

工程代碼在這里可以下載。或者這里下載最新代碼。

總結(jié)

以上是生活随笔為你收集整理的Qt:Windows编程—Qt实现进程管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。