Advertisement
Kant8

pd winapi

Aug 10th, 2017
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.49 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <tchar.h>
  3. #include <TlHelp32.h>
  4. #include "resource.h"
  5.  
  6. #define IDLB_LISTBOXPROC 10000
  7. #define IDLB_LISTBOXMODULE 10001
  8. #define IDB_REFRESH 10002
  9.  
  10.  
  11. HINSTANCE hInst;                                // Текущий экземпляр
  12. HWND hMainWnd;                                  // Handle главного окна
  13. HWND hListBoxProc, hListBoxModule;
  14. TCHAR* szTitle;                                 // Текст строки заголовка
  15. TCHAR* szWindowClass;                           // имя класса главного окна
  16.  
  17. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  18. void WINAPI FillProcessListBox(HWND, HWND);
  19. void WINAPI FillModulesListBox(HWND, HWND, DWORD);
  20. TCHAR* WINAPI GetPriorityName(DWORD);
  21. void WINAPI ChangePriority(HWND, DWORD);
  22. BOOL WINAPI SetProcessPriority(HWND, DWORD, DWORD);
  23. BOOL WINAPI DisplayContextMenu(HWND, HWND, WORD, WORD);
  24.  
  25. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  26. {
  27.     hInst = hInstance;
  28.     szWindowClass = _tcsdup(_T("lab7"));
  29.     szTitle = _tcsdup(_T("Lab7 - Process priority"));  
  30.  
  31.     //--------------------- регистрация класса окна
  32.     WNDCLASSEX wcex;
  33.  
  34.     wcex.cbSize = sizeof(WNDCLASSEX);
  35.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  36.     wcex.lpfnWndProc = WndProc;
  37.     wcex.cbClsExtra = 0;
  38.     wcex.cbWndExtra = 0;
  39.     wcex.hInstance = hInstance;
  40.     wcex.hIcon = LoadIcon(hInstance, IDC_ICON);
  41.     wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_ARROW));
  42.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  43.     wcex.lpszMenuName = NULL;
  44.     wcex.lpszClassName = szWindowClass;
  45.     wcex.hIconSm = NULL;
  46.  
  47.     if (!RegisterClassEx(&wcex))
  48.     {
  49.         MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  50.         return 1;
  51.     }
  52.  
  53.     //---------------------- создание и отрисовка окна
  54.     HWND hWnd = CreateWindow(
  55.         szWindowClass, szTitle,
  56.         WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,
  57.         CW_USEDEFAULT, CW_USEDEFAULT,
  58.         805, 599,
  59.         NULL,
  60.         NULL,
  61.         hInstance,
  62.         NULL);
  63.     if (!hWnd)
  64.     {
  65.         MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Lab6"), MB_ICONERROR | MB_OK);
  66.         return 1;
  67.     }
  68.     hMainWnd = hWnd;
  69.    
  70.     ShowWindow(hWnd, nCmdShow);
  71.     UpdateWindow(hWnd);
  72.  
  73.     //-------------------- обработчик сообщений
  74.     MSG msg;
  75.     while (GetMessage(&msg, NULL, 0, 0))
  76.     {
  77.         if (!IsDialogMessage(hWnd, &msg))
  78.         {
  79.             TranslateMessage(&msg);
  80.             DispatchMessage(&msg);
  81.         }
  82.     }
  83.    
  84.     return (int) msg.wParam;
  85. }
  86.  
  87. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  88. {
  89.     PAINTSTRUCT ps;
  90.     HDC hdc;
  91.     LRESULT res;
  92.     WORD controlID, controlNotifCode;
  93.     HWND control;
  94.     WORD x, y;
  95.     DWORD processID;
  96.     DWORD priorityClass;
  97.    
  98.     switch (message)
  99.     {
  100.     case WM_CREATE:
  101.         hListBoxProc = CreateWindow(_T("LISTBOX"), _T(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | LBS_STANDARD,
  102.             0, 25,
  103.             400, 550,
  104.             hWnd, (HMENU)IDLB_LISTBOXPROC,
  105.             hInst, NULL);
  106.         hListBoxModule = CreateWindow(_T("LISTBOX"), _T(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | LBS_STANDARD & ~LBS_SORT,
  107.             400, 25,
  108.             400, 550,
  109.             hWnd, (HMENU)IDLB_LISTBOXMODULE,
  110.             hInst, NULL);  
  111.         CreateWindow(_T("STATIC"), _T("Processes:"), WS_VISIBLE | WS_CHILD | SS_CENTER,
  112.             0, 5,
  113.             400, 20,
  114.             hWnd, NULL,
  115.             hInst, NULL);
  116.         CreateWindow(_T("STATIC"), _T("Modules:"), WS_VISIBLE | WS_CHILD | SS_CENTER,
  117.             400, 5,
  118.             400, 20,
  119.             hWnd, NULL,
  120.             hInst, NULL);
  121.         CreateWindow(_T("BUTTON"), _T("Refresh"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
  122.             360, 0,
  123.             60, 25,
  124.             hWnd, (HMENU)IDB_REFRESH,
  125.             hInst, NULL);
  126.         FillProcessListBox(hWnd, hListBoxProc);    
  127.         break;
  128.        
  129.        
  130.     case WM_COMMAND:
  131.         controlID = LOWORD(wParam);
  132.         controlNotifCode = HIWORD(wParam);
  133.         control = (HWND)lParam;
  134.         switch (controlID)
  135.         {
  136.         case IDLB_LISTBOXPROC:
  137.             if (controlNotifCode == LBN_SELCHANGE)
  138.             {
  139.                 res = SendMessage(control, LB_GETCURSEL, NULL, NULL);
  140.                 if ( res != LB_ERR)
  141.                 {
  142.                     res = SendMessage(control, LB_GETITEMDATA, res, NULL);
  143.                     if (res != LB_ERR)
  144.                     {
  145.                         FillModulesListBox(hWnd, hListBoxModule, res);
  146.                     }
  147.                 }
  148.             }
  149.             break;
  150.  
  151.         case IDB_REFRESH:
  152.             FillProcessListBox(hWnd, hListBoxProc);
  153.             SendMessage(hListBoxModule, LB_RESETCONTENT, NULL, NULL);
  154.             break;
  155.  
  156.         case ID_FILE_REALTIME:
  157.             ChangePriority(hWnd, REALTIME_PRIORITY_CLASS);
  158.             break;
  159.         case ID_FILE_HIGH:
  160.             ChangePriority(hWnd, HIGH_PRIORITY_CLASS);
  161.             break;
  162.         case ID_FILE_ABOVENORMAL:
  163.             ChangePriority(hWnd, ABOVE_NORMAL_PRIORITY_CLASS);
  164.             break;
  165.         case ID_FILE_NORMAL:
  166.             ChangePriority(hWnd, NORMAL_PRIORITY_CLASS);
  167.             break;
  168.         case ID_FILE_BELOWNORMAL:
  169.             ChangePriority(hWnd, BELOW_NORMAL_PRIORITY_CLASS);
  170.             break;
  171.         case ID_FILE_IDLE:
  172.             ChangePriority(hWnd, IDLE_PRIORITY_CLASS);
  173.             break;
  174.         }
  175.         break;
  176.        
  177.     case WM_CONTEXTMENU:
  178.         control = (HWND)wParam;
  179.         x = LOWORD(lParam);
  180.         y = HIWORD(lParam);
  181.         if (!DisplayContextMenu(hWnd, control, x, y))      
  182.             return DefWindowProc(hWnd, message, wParam, lParam);       
  183.         break;
  184.  
  185.     case WM_PAINT:  //-------------------- отрисовка окна
  186.         hdc = BeginPaint(hWnd, &ps);
  187.        
  188.         EndPaint(hWnd, &ps);
  189.         break;
  190.  
  191.     case WM_DESTROY:  //---------------- выход из приложения
  192.         PostQuitMessage(0);
  193.         break;
  194.  
  195.     default:
  196.         return DefWindowProc(hWnd, message, wParam, lParam);       
  197.     }
  198.     return 0;
  199. }
  200.  
  201. void WINAPI FillProcessListBox(HWND hWnd, HWND hListBox)
  202. {
  203.     HANDLE hSnapshot;
  204.     PROCESSENTRY32 pe;
  205.     HANDLE hProcess;
  206.     DWORD processPriorityClass;
  207.     LRESULT res;
  208.     TCHAR processInfo[MAX_PATH + 30];
  209.  
  210.     SendMessage(hListBox, LB_RESETCONTENT, NULL, NULL);
  211.  
  212.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  213.     if (hSnapshot == INVALID_HANDLE_VALUE)
  214.     {
  215.         MessageBox(NULL, _T("Can't take processess snapshot!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  216.         SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  217.     }
  218.  
  219.     pe.dwSize = sizeof(PROCESSENTRY32);
  220.     if (!Process32First(hSnapshot, &pe))
  221.     {
  222.         MessageBox(NULL, _T("Can't get processess list"), _T("Lab7"), MB_ICONERROR | MB_OK);
  223.         SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  224.     }
  225.    
  226.     do
  227.     {
  228.         hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID);
  229.         if (hProcess == NULL)
  230.             processPriorityClass = -1;
  231.         else
  232.         {
  233.             processPriorityClass = GetPriorityClass(hProcess);
  234.             CloseHandle(hProcess);
  235.         }
  236.  
  237.         _tcscpy(processInfo, pe.szExeFile);
  238.         _tcscat(processInfo, _T(" | Priority: "));
  239.         _tcscat(processInfo, GetPriorityName(processPriorityClass));       
  240.         res = SendMessage(hListBox, LB_ADDSTRING, NULL, (LPARAM)processInfo);
  241.         res = SendMessage(hListBox, LB_SETITEMDATA, res, (LPARAM)pe.th32ProcessID);
  242.         if (res == LB_ERR)
  243.         {
  244.             MessageBox(NULL, _T("Can't add info in listbox"), _T("Lab7"), MB_ICONERROR | MB_OK);
  245.             SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  246.         }
  247.     } while(Process32Next(hSnapshot, &pe));
  248.     CloseHandle(hSnapshot);
  249. }
  250.  
  251. TCHAR* WINAPI GetPriorityName(DWORD priority)
  252. {
  253.     TCHAR* res = NULL;
  254.     if (priority == REALTIME_PRIORITY_CLASS)
  255.         res = _tcsdup(_T("RealTime"));
  256.     else if (priority == HIGH_PRIORITY_CLASS)
  257.         res = _tcsdup(_T("High"));
  258.     else if (priority == ABOVE_NORMAL_PRIORITY_CLASS)
  259.         res = _tcsdup(_T("Above normal"));
  260.     else if (priority == NORMAL_PRIORITY_CLASS)
  261.         res = _tcsdup(_T("Normal"));
  262.     else if (priority == BELOW_NORMAL_PRIORITY_CLASS)
  263.         res = _tcsdup(_T("Below normal"));
  264.     else if (priority == IDLE_PRIORITY_CLASS)
  265.         res = _tcsdup(_T("Idle"));
  266.     else
  267.         res = _tcsdup(_T("Undefined"));
  268.     return res;
  269. }
  270.  
  271. void WINAPI FillModulesListBox(HWND hWnd, HWND hListBox, DWORD processID)
  272. {
  273.     HANDLE hSnapshot, hProcess;
  274.     MODULEENTRY32 me;
  275.     LRESULT res;
  276.     TCHAR moduleInfo[MAX_PATH];
  277.  
  278.     SendMessage(hListBox, LB_RESETCONTENT, NULL, NULL);
  279.  
  280.     hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID);
  281.     if (hProcess == INVALID_HANDLE_VALUE)
  282.     {
  283.         _tcscpy(moduleInfo, _T("Process doesn't exist!"));
  284.         res = SendMessage(hListBox, LB_ADDSTRING, NULL, (LPARAM)moduleInfo);
  285.         //MessageBox(NULL, _T("Process doesn't exist!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  286.         return;
  287.         //SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  288.     }
  289.     CloseHandle(hProcess);
  290.  
  291.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processID);
  292.     if (hSnapshot == INVALID_HANDLE_VALUE)
  293.     {
  294.         _tcscpy(moduleInfo, _T("Can't take modules snapshot!"));
  295.         res = SendMessage(hListBox, LB_ADDSTRING, NULL, (LPARAM)moduleInfo);       
  296.         //MessageBox(NULL, _T("Can't take modules snapshot!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  297.         return;
  298.         //SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  299.     }
  300.  
  301.     me.dwSize = sizeof(MODULEENTRY32);
  302.     if (!Module32First(hSnapshot, &me))
  303.     {
  304.         MessageBox(NULL, _T("Can't get modules list"), _T("Lab7"), MB_ICONERROR | MB_OK);
  305.         return;
  306.         //SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  307.     }
  308.    
  309.     do
  310.     {
  311.         _tcscpy(moduleInfo, me.szModule);
  312.         res = SendMessage(hListBox, LB_ADDSTRING, NULL, (LPARAM)moduleInfo);
  313.         if (res == LB_ERR)
  314.         {
  315.             MessageBox(NULL, _T("Can't add info in listbox"), _T("Lab7"), MB_ICONERROR | MB_OK);
  316.             SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  317.         }
  318.     } while(Module32Next(hSnapshot, &me)); 
  319.     CloseHandle(hSnapshot);
  320. }
  321.  
  322. BOOL WINAPI DisplayContextMenu(HWND hWnd, HWND control, WORD x, WORD y)
  323. {
  324.     RECT rect;
  325.     POINT p = {x, y};
  326.     GetClientRect(control, &rect);
  327.     rect.top += 30;
  328.     rect.bottom += 30;
  329.     if (p.x > 10000)
  330.         GetCursorPos(&p);
  331.     ScreenToClient(hWnd, &p);  
  332.     if (!PtInRect(&rect, p))
  333.         return FALSE;
  334.     ClientToScreen(hWnd, &p);
  335.  
  336.     HMENU hMenu;
  337.     hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1));
  338.     if (hMenu == NULL)
  339.     {
  340.         MessageBox(NULL, _T("Can't load menu"), _T("Lab7"), MB_ICONERROR | MB_OK);
  341.         SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  342.     }
  343.     hMenu = GetSubMenu(hMenu, 0);
  344.     TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
  345.         p.x, p.y, NULL, hWnd, NULL);
  346.     DestroyMenu(hMenu);
  347.     return TRUE;
  348. }
  349.  
  350. void WINAPI ChangePriority(HWND hWnd, DWORD priorityClass)
  351. {
  352.     DWORD line, processID;
  353.     TCHAR processInfo[MAX_PATH + 30];
  354.  
  355.     line = SendMessage(hListBoxProc, LB_GETCURSEL, NULL, NULL);
  356.     if ( line != LB_ERR)
  357.     {
  358.         processID = SendMessage(hListBoxProc, LB_GETITEMDATA, line, NULL);
  359.         if (processID != LB_ERR)
  360.         {
  361.             if(!SetProcessPriority(hWnd, processID, priorityClass))
  362.                 return;
  363.  
  364.             SendMessage(hListBoxProc, LB_GETTEXT, line, (LPARAM)processInfo);
  365.             TCHAR c = '|';
  366.             TCHAR* str = processInfo;
  367.             size_t pos = 0;
  368.             while (*str != c && *str != '\0')
  369.             {
  370.                 pos++;
  371.                 str++;
  372.             }
  373.             if (*str == '\0')
  374.             {
  375.                 MessageBox(NULL, _T("Can't parse name!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  376.                 SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  377.             }
  378.             pos += 2;
  379.             processInfo[pos] = '\0';
  380.             _tcscat(processInfo, _T("Priority: "));
  381.             _tcscat(processInfo, GetPriorityName(priorityClass));
  382.  
  383.             SendMessage(hListBoxProc, LB_DELETESTRING, line, NULL);
  384.             line = SendMessage(hListBoxProc, LB_INSERTSTRING, line, (LPARAM)processInfo);
  385.             SendMessage(hListBoxProc, LB_SETITEMDATA, line, processID);
  386.         }
  387.     }
  388.     else
  389.     {
  390.         MessageBox(NULL, _T("At first select process."), _T("Lab7"), MB_ICONINFORMATION | MB_OK);
  391.     }
  392. }
  393.  
  394. BOOL WINAPI SetProcessPriority(HWND hWnd, DWORD processID, DWORD priorityClass)
  395. {
  396.     HANDLE hProcess;
  397.     hProcess = OpenProcess(PROCESS_SET_INFORMATION, FALSE, processID);
  398.     if (hProcess == INVALID_HANDLE_VALUE)
  399.     {
  400.         MessageBox(NULL, _T("Can't open process to set priority!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  401.         return FALSE;
  402.         //SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  403.     }
  404.     if (!SetPriorityClass(hProcess, priorityClass))
  405.     {
  406.         MessageBox(NULL, _T("Can't set priority!"), _T("Lab7"), MB_ICONERROR | MB_OK);
  407.         return FALSE;
  408.         //SendMessage(hWnd, WM_DESTROY, NULL, NULL);
  409.     }
  410.     CloseHandle(hProcess);
  411.     return TRUE;
  412. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement