Форум программистов, компьютерный форум CyberForum.ru

Поиск процесса по имени - C++

Восстановить пароль Регистрация
 
ALEXKIRNAS
10 / 10 / 2
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 12:11     Поиск процесса по имени #1
Нужно написать функцию которая будет искать запущен ли процесс (имя процесса за ранние известно).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
24.12.2013, 12:22     Поиск процесса по имени #2
WTSEnumerateProcesses
Одним вызовом получаете список запущенных процессов, их PID-ы и имена exe.
ALEXKIRNAS
10 / 10 / 2
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 12:24  [ТС]     Поиск процесса по имени #3
Спасибо. А можно пример программы.
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
24.12.2013, 12:35     Поиск процесса по имени #4
Код, который проверяет, запущен ли стандартный калькулятор (calc.exe):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <Windows.h>
#include <WtsApi32.h>
 
 
 
#pragma comment(lib, "wtsapi32.lib")
 
 
 
int main()
{
    WTS_PROCESS_INFOW * pProcessInfo;
    DWORD               NumProcesses;    
 
    if (NULL == WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE,
        0, // Reserved.
        1, // Version,
        &pProcessInfo,
        &NumProcesses))
    {
        printf("WTSEnumerateProcessesW failed with last error %lu.\r\n", GetLastError());
        return EXIT_FAILURE;
    }
 
    bool fCalcFound = false;
 
    for (DWORD i = 0; i < NumProcesses; ++i)
    {
        if (0 == lstrcmpW(pProcessInfo[i].pProcessName, L"calc.exe"))
        {
            fCalcFound = true;
            break;
        }
    }
 
    WTSFreeMemory(pProcessInfo);   
 
    if (false == fCalcFound)
    {
        printf("No calculator running :(\r\n");
    }
 
    else
    {
        printf("Yes, calculator is running !\r\n");
    }
 
    return EXIT_SUCCESS;
}
ALEXKIRNAS
10 / 10 / 2
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 14:51  [ТС]     Поиск процесса по имени #5
Большое спасибо... Это то что нужно, но как сделать что-бы программа проверяла запущена ли какая программа кожною секунду и не сильно грузила процессор.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.12.2013, 15:05     Поиск процесса по имени #6
C++
1
2
3
4
5
while(1)
{
//проверить состояние процесса
Sleep(1000);
}
ALEXKIRNAS
10 / 10 / 2
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 17:35  [ТС]     Поиск процесса по имени #7
Огромное спасибо всем, я нашел ответ на свой вопрос
Если можно расскажите принцип роботы кода (напишите коментарии в листинге кода), а то я в программирование под виндовс 0
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 16:37     Поиск процесса по имени #8
Убежденный, спасибо за пример, первый что нашел рабочий) Но возникли такие вопросы:
1) Как процесс определить только по части имени программы например: "ca" -> "calc.exe", "exp" -> "explorer.exe". Пробовал strstr, но ничего не вышло(
2) Как вывести список процессов допустим в консоль через cout?
Делаю так:
cout << (char *)pProcessInfo[i].pProcessName << endl;
Получаю только первые буквы из названий процессов, а если так:
cout << pProcessInfo[i].pProcessName << endl;
Получаю:
0030с338
0030с339
0030с348
0030с33A
0030с33B
и тому подобное...

Сам я ВБшник с си только пытаюсь разобраться, такчто прошу больно не пинать
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.03.2014, 16:41     Поиск процесса по имени #9
Цитата Сообщение от skMaster Посмотреть сообщение
1) Как процесс определить только по части имени программы например: "ca" -> "calc.exe", "exp" -> "explorer.exe". Пробовал strstr, но ничего не вышло(
Cравновать имя не полностью, а частично
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 16:43     Поиск процесса по имени #10
Цитата Сообщение от aLarman Посмотреть сообщение
Cравновать имя не полностью, а частично
Цитата Сообщение от skMaster Посмотреть сообщение
Пробовал strstr, но ничего не вышло
Както так...

Добавлено через 39 секунд
Цитата Сообщение от skMaster Посмотреть сообщение
с си только пытаюсь разобраться
И так...
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.03.2014, 16:47     Поиск процесса по имени #11
Цитата Сообщение от skMaster Посмотреть сообщение
Получаю только первые буквы из названий процессов
первые буквЫ или буквУ, попробуйте так
C++
1
2
3
4
for(int i = 0; i < pProcessInfo[i].pProcessName.size(); i++)
{
wcout<<pProcessInfo[i].pProcessName[i];
}
Добавлено через 2 минуты
Цитата Сообщение от skMaster Посмотреть сообщение
Пробовал strstr, но ничего не вышло
C++
1
2
3
4
5
6
7
8
9
10
11
wstring Name = L"ca";
bool isEqual = true;
for(int i = 0 ; i < Name.size(); i++)
{
if(Name[i] != pProcessInfo[i].pProcessName[i])//не самое безопасное, потому что вдруг Вы зададите имя кторое длинне имени процесса
{ isEqual = false; break;}
}
if(isEqlual)
{
//
}
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 17:26     Поиск процесса по имени #12
Спасибо большое. Попробую сначала сравнивать длину имени с моей строкой!
А по второму вопросу Вы тоже помогли, сделал так:
C++
1
wcout << pProcessInfo[i].pProcessName << endl;
Добавлено через 35 минут
По первому вопросу получилось так:
C++
1
2
3
4
5
6
7
8
9
10
11
wchar_t * pp = L"exp";
 
    for(DWORD i=0; i<NumProcesses; ++i)
    {
        wchar_t * process = pProcessInfo[i].pProcessName;
 
        if(wcsstr(process, pp) != 0)
        {
            wcout << L"Process found: " << process << endl;
        }
    }
А пробую искать несколько процессов, ничего невыходит. Делаю такой массив, перебором вравниваю, прога компилится, но падает с ошибкой(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wchar_t * pp[] = {L"calc", L"calc.exe", L"exp"};
 
    for(DWORD i=0; i<NumProcesses; ++i)
    {
        wchar_t * process = pProcessInfo[i].pProcessName;
 
        for(int j=0; j<sizeof(pp); ++j)
        {
            if(wcsstr(process, pp[j]) != 0)
            {
                wcout << L"Process found: " << process << endl;
            }
        }
    }
Где ошибаюсь?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.03.2014, 17:30     Поиск процесса по имени #13
sizeof(pp) = 4 вот где
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 17:43     Поиск процесса по имени #14
Тоесть я получил sizeof(int) = 4 байта? Но проблему это не решило, написал цифрой ограничение, всеравно ошибка (((

Добавлено через 8 минут
Поменял префиксный инкремент на постфиксный и всё заработало (++i) на (i++).
А размер массива определил так: (sizeof(pp)/sizeof(pp[0]))
Вот что вышло (процессы выводятся нормально):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wchar_t * pp[] = {L"note", L"wor", L"calc", L"agen", L"exp"};
 
    if(WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pProcessInfo, &NumProcesses) == NULL)
    {
        return false;
    }
 
    for(DWORD i=0; i<NumProcesses; i++)
    {
        wchar_t * process = pProcessInfo[i].pProcessName;
        
        for(int j=0; j<(sizeof(pp)/sizeof(pp[0])); j++)
        {
            if(wcsstr(process, pp[j]) != 0)
            {
                wcout << L"Process found: " << process << endl;
            }
        }
    }
Добавлено через 2 минуты
Новый вопрос: Как заставить wcsstr() игнорить регистр букв? (если L"exp" сменит на L"Exp" то ничего не найдется)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.03.2014, 17:46     Поиск процесса по имени #15
Цитата Сообщение от skMaster Посмотреть сообщение
игнорить регистр букв? (если L"exp" сменит на L"Exp" то ничего не найдется)
написать свой аналог, а там все приводит к единому регистру
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 17:52     Поиск процесса по имени #16
А у меня не игнорит регистр(( MS Visual C++ 2010 Express

Добавлено через 41 секунду
Даже сделал скрины но непойму как их тут выложить(
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 17:56     Поиск процесса по имени #17
Во, разобрался
Кликните здесь для просмотра всего текста
Поиск процесса по имениПоиск процесса по имени
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 18:53     Поиск процесса по имени
Еще ссылки по теме:

C++ в case 7 - нужно сделать поиск по номеру группы, а в case 6 сортировку по имени
C++ Файлы и структуры. Поиск студента по имени и сортировка
Поиск студента по имени, фамилии и iq C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
skMaster
3 / 3 / 2
Регистрация: 26.02.2013
Сообщений: 38
26.03.2014, 18:53     Поиск процесса по имени #18
Как же всё сложно, пол часа гугла и вот результат:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wchar_t * pp[] = {L"note", L"wor", L"calc", L"mag", L"exp"};
 
    for(DWORD i=0; i<NumProcesses; i++)
    {
        wchar_t * process = pProcessInfo[i].pProcessName;
        
        for(int j=0; j<(sizeof(pp)/sizeof(pp[0])); j++)
        {
            if(wcsstr(_wcslwr(process), pp[j]) != 0)
            {
                wcout << L"Process found: " << process << endl;
            }
        }
    }
Кликните здесь для просмотра всего текста
Но если сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
wchar_t * pp[] = {L"noTe", L"wOr", L"caLc", L"Mag", L"Exp"};
 
    for(DWORD i=0; i<NumProcesses; i++)
    {
        wchar_t * process = pProcessInfo[i].pProcessName;
        
        for(int j=0; j<(sizeof(pp)/sizeof(pp[0])); j++)
        {
            if(wcsstr(_wcslwr(process), _wcslwr(pp[j])) != 0)
            {
                wcout << L"Process found: " << process << endl;
            }
        }
    }
То нифига не работает!
Yandex
Объявления
26.03.2014, 18:53     Поиск процесса по имени
Ответ Создать тему
Опции темы

Текущее время: 09:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru