大家好,我是KookNut39,在CSDN寫文,分享一些自己認為在學習程序中比較重要的東西,希望可以幫助你進步,最近在更新C/C++方面的知識,感興趣的可以歡迎關注博主,去專欄查看之前的文章,希望未來能和大家共同探討技術,
我相信對于很多學習C++的同學來說,在初學階段都比較疑惑的一個問題就是,我學這個東西可以干什么?就是為了輸出“Hello World”嗎?好像學了一堆東西總覺得學的云里霧里,不知道自己能干點什么,變數我知道,資料結構我也了解,類我也學習過,指標我也看過,STL標準模板庫老師也講過,但是這些東西在一起可以干什么?

今天就讓kt來帶大家動手實踐一下,以便提高大家學習的熱情,寫一段代碼C/C++代碼在windows系統上,實作所有行程遍歷,也就是一個破產乞丐版任務管理器,
默認大家都已經掌握了一定的C/C++編程水平,但是掌握度不高也沒關系,照著步驟來,你也一定可以實作行程遍歷的操作,
我們首先從main函式開始講起:
int main()
{
//設定地域化資訊,設定中文,能夠識別中文
setlocale(LC_ALL, "chs");
char* v1 = (char*)("行程列舉:");
printf("%s\n", v1);
//列舉行程的函式
EnumSystemProcess();
system("pause");
system("cls");
system("pause");
return 0;
}
首先我們在main函式中呼叫了一個設定地域化資訊的setlocale函式,因為我們在文中要輸出中文,接著就是列印一個字串,這些都不是重要的代碼,接下來呼叫EnumSystemProcess()函式,這是個自己實作的函式,從這里開始遍歷行程:
//列舉系統行程 拍攝快照
HANDLE SnapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (SnapHandle == INVALID_HANDLE_VALUE)
{
return;
}
這是EnumSystemProcess首先要做的事情,那就是拍攝系統快照,拍攝系統快照的函式是CreateToolhelp32Snapshot,傳參為TH32CS_SNAPPROCESS的時候就會回傳行程快照的句柄,接下來:
//PROCESSENTRY32 必須這樣初始化
PROCESSENTRY32 ProcessEntry = { sizeof(PROCESSENTRY32) };
bool IsOk = ProcessFirst(SnapHandle, &ProcessEntry);
PROCESSENTRY32是一個包含在tlhelp32.h頭檔案下的系統結構體,其中包含了這些資訊:
typedef struct tagPROCESSENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
CHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32;
其中關鍵的欄位官方結構體都已經給出了注釋,我們需要用到的也就是取其中的th32ProcessID和szExeFile,因為我們只列印行程名和行程ID,
然后是ProcessFirst函式,這是我自實作的函式,其中為了越過系統空閑行程

行程ID為0:
BOOL ProcessFirst(HANDLE SnapHandle, PPROCESSENTRY32 ProcessEntry)
{
BOOL IsOk = Process32First(SnapHandle, ProcessEntry);
if (IsOk && (ProcessEntry->th32ProcessID == 0))
{
//如果PID = 0,那就byebye 繼續去找下一個行程的ProcessEntry
IsOk = ProcessNext(SnapHandle, ProcessEntry);
}
return IsOk;
}
然后在其中呼叫Process32First這個系統函式,為了得到第一個行程的ProcessEntry,如果當前行程id為0,那就繼續遍歷,去找下一個行程:
BOOL ProcessNext(HANDLE SnapHandle, PPROCESSENTRY32 ProcessEntry)
{
BOOL IsOk = Process32Next(SnapHandle, ProcessEntry);
if (IsOk && (ProcessEntry->th32ProcessID == 0))
{
//遞回呼叫
IsOk = ProcessNext(SnapHandle, ProcessEntry);
}
return IsOk;
}
在這里我們呼叫Process32Next去得到下一個行程的PPROCESSENTRY32結構資訊,然后進行ID判斷,如果不是ID=0,那就回傳,回傳到EnumSystemProcess的呼叫處,接下來執行for回圈來遍歷列印就ok了
//索引 為了統計當前行程總數
int Index = 0;
for (; IsOk; IsOk = ProcessNext(SnapHandle, &ProcessEntry))
{
char BufferData[1024];
//c:\\windows\\hello.exe 尋找'\\'最后出現的位置
char* ProcessName = strrchr(ProcessEntry.szExeFile, '\\');
if (ProcessName == NULL)
{
ProcessName = ProcessEntry.szExeFile;
}
else
{
ProcessName++; //越過反斜杠
}
sprintf(BufferData, "%-50s% (0x%08X)", ProcessName, ProcessEntry.th32ProcessID);
printf("%s\n", BufferData);
Index++;
}
printf("當前系統行程總共有 %d 個\n", Index);
給大家看一下效果圖:

整個遍歷行程的實作就到這里結束了,如果大家還有不懂得地方,沒關系,可以隨時聯系我,我來幫大家解答,或者有需要原始碼的小伙伴,也可以找我拿歐!

喜歡博主的文章,麻煩給個一鍵三連支持一下🤞🤞🤞,您的支持,是我最大的創作動力!
今日份共勉:“相逢意氣為君飲,系馬高樓垂柳邊”
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286199.html
標籤:AI
