Qt:Windows编程—Qt实现进程管理
生活随笔
收集整理的這篇文章主要介紹了
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python判断进程是否存在
- 下一篇: windows 播放MP3音乐