در این پست ما قصد داریم برنامه ای بنویسیم که پروسس های موجود در سیستم به همراه id و Priority نمایش میدهد. ما در این برنامه برای انجام این کار از API موجود در سیستم عامل استفاده میکنیم .

در ابتدا دو متغیر برنای نگه داری id و Priority تعریف کرده سپس یک تصویر از پراسس های موجود در سیستم میگیریم .
سپس نمونه ای از ساختمان ای که در توابع موجود در ویندوز تعریف شده ساخته و فضایی به آن اختصاص میدهیم .
در قسمت بعد مقدار بولینی را تعریف کرده و تابعی را در آن فراخوانی میکنیم که به مقدار اول هندلی اشاره میکند که از قبل تصاویر پراسس ها در آن ریخته شده ، و در صورتی که مقدار موجود باشد مقدار درستی و در غیر این صورت مقدار نا درستی را برمیگرداند.
ما از این مقدار در حلقه تکرار به منظور گرفتن پراسس بعدی استفاده میکنیم.
در اولین خط حلقه ما پراسس را با تابع OpenProcess باز کرده و هندلی از آن میگیریم تا در ادامه از آن استفاده کنیم .
تابع گرفتن و محاسبه و نشان دادن ارور را بعد از آن مینویسیم تا در صورت مشاهده خطا بتوانیم آن را مشاهده کنیم.

در خط بعدی ما اولویت پراسس را با تابعی دریافت کردیم و با حالت ها شرطی آن را به استرینگ مناسب ترجمه میکنیم .

در خطوط بعدی دستگره پراسس را بسته سپس id پراسس را از مقدار عددی به مقدار استرینگ تبدیل میکنیم  و مقادیر را در کنسول چاپ میکنیم .

در خط آخر حلقه پراسس موجود بعدی را از پراسس های تصویر شده درخواست میکنیم ، در صورت به اتمام رسیدن پراسس ها مقدار نادرست را برمیگرداند و سپس برنامه از حلقه خارج شده هندل اصلی بسته میشود و برنامه تمام میشود ، و در صورت موجود بودن پراسس بعدی این فرایند تکرار میشود .

سورس برنامه مورد نظر :

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <Strsafe.h>
#include <tchar.h>

using namespace std;

int main()
{

TCHAR szPriority[15];
TCHAR szProcessId[15];

//get image from process in windows
HANDLE hProcessSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0);
HANDLE hProcess;

DWORD dwPriority = -1;
PROCESSENTRY32 pe32;
ZeroMemory(&pe32, sizeof(PROCESSENTRY32));
pe32.dwSize = sizeof(PROCESSENTRY32);
//get information firest process
BOOL b = Process32First(hProcessSnap, &pe32);
while (b)
{
//open handle process
hProcess = OpenProcess(
PROCESS_ALL_ACCESS, false, pe32.th32ProcessID);

DWORD dwError = GetLastError();
if (hProcess == NULL && pe32.th32ProcessID != 0 &&
dwError != ERROR_ACCESS_DENIED)
{
return 0;
}

//get firest ... convert to string
dwPriority = GetPriorityClass(hProcess);
switch (dwPriority)
{
case REALTIME_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("Realtime"));
break;
case HIGH_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("High"));
break;
case ABOVE_NORMAL_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("Above Normal"));
break;
case NORMAL_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("Normal"));
break;
case BELOW_NORMAL_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("Below Normal"));
break;
case IDLE_PRIORITY_CLASS:
StringCchCopy(szPriority, 15, _T("Idle"));
break;
default:
StringCchCopy(szPriority, 15, _T("N/A"));
break;
};
CloseHandle(hProcess);
//convert ID from intiger to string
_itot_s(pe32.th32ProcessID, szProcessId, 14, 10);


cout << pe32.szExeFile;
cout.width(30);
cout << "pid: " << szProcessId
<< " Priority: " << szPriority << "\n";

b = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);

system("pause");
return 0;
}