Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Список процессов на WinAPI


Автор: sOckets 7.9.2006, 19:23
В общем я написал вот на WinAPI програмульку , которая достаёт список процессов с помощью CreateToolhelp32Snapshot, Process32First, Process32Next. Жду комментарий , предупреждаю я новичок.Покажите что я не совсем правильно зделил, или может алгоритмы не совсем оптимизированы...в общем код.
Компилятор :  Microsoft ® Incremental Linker Version 6.00.8168
Команда      :  cl /MD prc.cpp gdi32.lib user32.lib /link /opt:nowin98 /MAP
Файлы          :  prc.cpp , options.h
Функции      :  Список процессов(название файлов) , ID процесса , Количество потоков.
Баги             :  если название EXE файла одинаковое , инфа даёться по первому попавшемуся...
Размер EXE : 5 120 байт
prc.cpp
Код

#include <windows.h>
#include <tlhelp32.h>
#include "options.h"
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hCursor = LoadCursor(NULL, IDC_ARROW); 
    w.hbrBackground = bg_color;
    w.lpszClassName = "My Class";
    RegisterClass(&w);
    hwnd =         CreateWindow("My Class", "Процессы в системе",WS_VISIBLE,300, 200, 410, 310, NULL, NULL, hInstance, NULL);
    PList =         CreateWindow("ListBox", NULL, LBS_STANDARD|WS_CHILD|WS_BORDER|WS_VISIBLE, 10,10,300,288,hwnd,(HMENU) IDC_PList,hInstance,NULL);
    RefreshP =     CreateWindow("Button","Обновить",WS_CHILD|WS_BORDER|WS_VISIBLE,315,10,80,20,hwnd,(HMENU) IDC_RefreshP,hInstance,NULL);
    ExitB =     CreateWindow("Button","Выход",WS_CHILD|WS_BORDER|WS_VISIBLE,315,35,80,20,hwnd,(HMENU)IDC_ExitB,hInstance,NULL);
    PId =         CreateWindow("STATIC","ID процесса",WS_CHILD|WS_VISIBLE|WS_BORDER,315,60,80,16,hwnd,NULL,hInstance,NULL);
    Static_TID = CreateWindow("STATIC","Потоки",WS_CHILD|WS_VISIBLE|WS_BORDER,315,80,80,16,hwnd,NULL,hInstance,NULL);
    HFONT hf=CreateFont(-10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Tahome");
    SendMessage(PId, WM_SETFONT, (WPARAM)hf, 0);
    SendMessage(Static_TID, WM_SETFONT, (WPARAM)hf, 0);
    SendMessage(PList, WM_SETFONT, (WPARAM)hf, 0);
    SendMessage(ExitB, WM_SETFONT, (WPARAM)hf, 0);
    SendMessage(KillP, WM_SETFONT, (WPARAM)hf, 0);
    SendMessage(RefreshP, WM_SETFONT, (WPARAM)hf, 0);
    GetSystemProcessList();    
    CloseHandle(hSnapshot);
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    if (HWND(lparam)==PList)
    {
       switch (HIWORD(wparam))
       {
           case LBN_SELCHANGE:
           {
                if (LOWORD (wparam) >= 1);
                {
                    itemIndex = SendMessage(PList,LB_GETCURSEL,0,0);
                    SendMessage (PList, LB_GETTEXT, itemIndex, (LPARAM) CurrentWord);
                    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                    Entry.dwSize = sizeof(Entry);    
                    Process32First(hSnapshot, &Entry);
                    do {
                    if (strcmp(CurrentWord,Entry.szExeFile)==0)
                    {
                        PRID=Entry.th32ProcessID;
                        itoa(PRID,char_pid,10);
                        SetWindowText(PId,char_pid);
                        PRID=Entry.cntThreads;
                        itoa(PRID,char_pid,10);
                        SetWindowText(Static_TID,char_pid);
                        break;
                    }
                    } while (Process32Next(hSnapshot, &Entry ) );
                }
           }
       }
    }
    switch (Message){
    case WM_COMMAND:
        switch(wparam)
        {
            case IDC_RefreshP:
            {
                GetSystemProcessList();
                return 0;
            }
            case IDC_ExitB:
            {
                PostQuitMessage(0);
            }    
        } return 0;
    case WM_DESTROY: 
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}


options.h
Код

// ID Кнопок и элементов программы
#define IDC_RefreshP    101
#define IDC_ExitB        102
#define IDC_PList        103
#define IDC_Pid            104
#define MAX_WORD_LEN 200
// Окна
HBRUSH            bg_color=(HBRUSH)CreateSolidBrush((RGB(149,177,188)));
                                // Цвет формы
MSG                msg;            // Сообщения
WNDCLASS        w;                // Класс окна
HWND            hwnd,            // Главное окно
                PList,            // ListBox - список процессов
                RefreshP,            // Кнопка для обновления списка процессов
                KillP,            // Кнопка убить процесс
                ExitB,            // Выход
                PId,                // ID процесса
                Static_TID;
// Переменные для получения списка процессов
static UINT        itemIndex;
static char        CurrentWord[MAX_WORD_LEN];
int                PRID;
char                char_pid[100];
HANDLE            hSnapshot;
PROCESSENTRY32    Entry;
// эта функция вызывается для каждого процесса в перечислении
void GetSystemProcessList()
{
    SendMessage(PList,LB_RESETCONTENT,NULL,NULL);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    Entry.dwSize = sizeof(Entry);    
    Process32First(hSnapshot, &Entry);
    do {
    SendMessage(PList,LB_ADDSTRING,0,(LPARAM)Entry.szExeFile);
    } while (Process32Next(hSnapshot, &Entry ) );
}


Жду коментов ....

Автор: maxim1000 7.9.2006, 21:36
общее замечание по коду:
Цитата(ilovewinsocks @  7.9.2006,  18:23 Найти цитируемый пост)
GetSystemProcessList

обычно не рекомендуется писать код в h-файлах
если хочется его использовать в разных файлах - выделить в отдельный cpp и подключить в проект, а в h-файлы - объявление

конечно, бывает, когда такое расположение кода обосновано (шаблоны, например), но, насколько я вижу здесь не такой случай...

Автор: sOckets 7.9.2006, 22:19
Ок, буду знать. Что то раздел "WinAPI" умирает smile

Автор: Damarus 8.9.2006, 06:11
ilovewinsocks, в некоторых случаях ID процесса и кол-во потоков отображаются не верно.

Добавлено @ 06:12 
А, ты уже и сам заметил smile 

Автор: sOckets 8.9.2006, 07:47
Угу , дело в том что если посмотреть на сорцы , то сравнение у меня идёт не по ID процесса , а по названию EXEшника...Вот допусим 4 svhost.exe :-) по этому инфа по второму процессу svhost.exe будет как по первому попавшемуся.
Вопрос , как сделать такое :
http://img179.imageshack.us/img179/7586/newlistboxxv4.jpg
LISTBOX но с несколькими полями.
И потом почему у меня пропадает кнопка ответить ? Уже надоело , уже нервов не хватает 

user posted image Opera
user posted image FireFox

Блин я уже на пределе , щя пойду когонить побью

Автор: Alexandr87 8.9.2006, 08:30
гы опера. используй нормальный броузер и будет тебе счастье

Автор: sOckets 8.9.2006, 12:18
Опера нормальный браузер , лутший !
Странно , главное дома (щяс я из дома) всё нормально показывает , а вот на работе нет...

Автор: PuLN 8.9.2006, 17:21
пинай админа))
если сам не админ))

Автор: Alexandr87 8.9.2006, 19:09
посмотри сюда, ни у одного тебя подобная проблемма
http://forum.vingrad.ru/index.php?showtopic=106452&view=all

Автор: sOckets 8.9.2006, 23:21
уже smile

Автор: Damarus 9.9.2006, 07:45
Цитата(ilovewinsocks @  8.9.2006,  08:47 Найти цитируемый пост)
Вопрос , как сделать такое :http://img179.imageshack.us/img179/7586/newlistboxxv4.jpgLISTBOX но с несколькими полями.

Это не ListBox, это ListView.

Автор: sOckets 11.9.2006, 21:56
Ок, спасибо.

Автор: sOckets 13.9.2006, 15:11
Цитата
Это не ListBox, это ListView.

Дайте пожалуйста примерчик как его создавать

http://ru.livecode.org/index.php/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB_ListView_%D0%B2_WinAPI
нашёл.

Автор: Damarus 13.9.2006, 16:23
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/listview_using.asp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)