Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
1

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

24.12.2013, 12:11. Показов 7264. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать функцию которая будет искать запущен ли процесс (имя процесса за ранние известно).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2013, 12:11
Ответы с готовыми решениями:

Поиск процесса по имени
Здравствуйте, помогите пожалуйста перевести с Lua код поиск процесса по имени, на язык...

Поиск процесса по имени
Такой вопрос: я ввожу с клавиатуры имя процесса и можно ли проверить, запущен ли процесс с таким...

Поиск процесса по имени
Помогите написать программу поиска процесса по имени на MS Visual Studio 2010.

Как узнать id процесса по имени процесса?
Как узнать id процесса по имени процесса? Например ищем notepad.exe и возвращается id этого...

17
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.12.2013, 12:22 2
WTSEnumerateProcesses
Одним вызовом получаете список запущенных процессов, их PID-ы и имена exe.
1
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 12:24  [ТС] 3
Спасибо. А можно пример программы.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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;
}
2
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 14:51  [ТС] 5
Большое спасибо... Это то что нужно, но как сделать что-бы программа проверяла запущена ли какая программа кожною секунду и не сильно грузила процессор.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
24.12.2013, 15:05 6
C++
1
2
3
4
5
while(1)
{
//проверить состояние процесса
Sleep(1000);
}
1
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
24.12.2013, 17:35  [ТС] 7
Огромное спасибо всем, я нашел ответ на свой вопрос
Если можно расскажите принцип роботы кода (напишите коментарии в листинге кода), а то я в программирование под виндовс 0
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
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
и тому подобное...

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

Добавлено через 39 секунд
Цитата Сообщение от skMaster Посмотреть сообщение
с си только пытаюсь разобраться
И так...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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)
{
//
}
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
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;
            }
        }
    }
Где ошибаюсь?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.03.2014, 17:30 13
sizeof(pp) = 4 вот где
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
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" то ничего не найдется)
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.03.2014, 17:46 15
Цитата Сообщение от skMaster Посмотреть сообщение
игнорить регистр букв? (если L"exp" сменит на L"Exp" то ничего не найдется)
написать свой аналог, а там все приводит к единому регистру
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
26.03.2014, 17:52 16
А у меня не игнорит регистр(( MS Visual C++ 2010 Express

Добавлено через 41 секунду
Даже сделал скрины но непойму как их тут выложить(
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
26.03.2014, 17:56 17
Во, разобрался
Кликните здесь для просмотра всего текста
Поиск процесса по имени
Поиск процесса по имени
0
4 / 4 / 5
Регистрация: 26.02.2013
Сообщений: 42
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;
            }
        }
    }
То нифига не работает!
0
26.03.2014, 18:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2014, 18:53
Помогаю со студенческими работами здесь

Проверка имени процесса
Здравствуйте, я тут новичек и собственно в яве не очень силен. У меня есть код, он берет имена...

Вывод имени процесса
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;string&gt; #include &lt;ctime&gt; #include...

Проверка имени процесса
Здравствуйте, у меня есть код: public static boolean checkProcesses(String onlineData) { ...

Завершение процесса по имени
есть только имя процесса, какие функции понадобятся чтоб его завершить? Добавлено через 9 минут...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru