Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 26
1

Как узнать имя exe, зная его id?

21.07.2015, 12:20. Показов 1198. Ответов 4
Метки нет (Все метки)

Пишу программу отслеживающие активность пользователя. Проблема стоит в том что не могу найти функций которая по id процесса может вывести имя exe как в диспетчере задач нашел только как выводить путь до 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
 
{
    while (true)
    {
    
        setlocale(LC_ALL, "rus");
        Sleep(1000);
 
        char username[UNLEN + 1];
        DWORD len = UNLEN + 1;
        GetUserName(username, &len);
    
 
        ofstream file("//ACCESS/main/log.txt", ios_base::app); //создание перменно ofstream
 
        time_t rawtime;                                     //получения даты и времени
        struct tm * timeinfo;
        time(&rawtime);
        timeinfo = localtime(&rawtime);
 
        TCHAR pcname[256];                                   //Имя ПК
        unsigned long size = 256;                                    
        GetComputerName(pcname, &size);
 
        POINT kyr1;                                         //Стартовая позиция курсора
        GetCursorPos(&kyr1);
        SetCursorPos(kyr1.x, kyr1.y);
 
        Sleep(1000);
        POINT kyr2;                                       //2-я позиция курсора
        GetCursorPos(&kyr2);
        SetCursorPos(kyr2.x, kyr2.y);
 
 
        if (kyr1.x == kyr2.x, kyr1.y == kyr2.y)
        {
            file << username << endl;
            file << asctime(timeinfo) << endl;
            file << "Пользователь не Активен" << endl; // запись строки в файл
            file.close(); // закрываем файл
        }
 
        else
        {
            DWORD idThread;
            HANDLE hn = 0;
            TCHAR WindoysName[250];
            HWND hwnd=0;
            char exename[MAX_PATH] = { 0 };
            DWORD dw = 256;
            hwnd = GetForegroundWindow();
            int len = GetWindowText(hwnd,WindoysName, 250);
 
            GetWindowThreadProcessId(hwnd, &idThread);
            hn = OpenProcess(PROCESS_ALL_ACCESS, false, idThread);
            GetModuleFileNameEx(hn, NULL,exename, dw);
 
            file << "PC Name - " << pcname << "\tUser Name - " << username << endl;//имя ПК имя юзера
            file << WindoysName<< endl; // имя окна
            file << exename << endl;// путь до exe
            file << asctime(timeinfo) << endl;
            file.close(); // закрываем файл
        }
    }
 
    getchar();
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2015, 12:20
Ответы с готовыми решениями:

Как узнать полное имя файла зная его краткое имя?
например при запуске программы достаточно написать &quot;Excel&quot; или &quot;Calc&quot; при этом система уже в курсе...

Как узнать имя exe зная его id (WinApi,c++)
Пишу программу отслеживающие активность пользователя. Проблема стоит в том что не могу найти...

Узнать WHnd по запущенному exe файлу, зная только имя файла prog.exe
В общем сабж. Само название окна может иметь различные имена так уже FindWindow не вариант. Нужно...

Как узнать имя окна (обьекта), зная его хэндл?
Допустим, хэндл окна я узнаю так: HANDLE h=WindowFromPoint(Mouse-&gt;CursorPos); Класс так:...

4
Ушел с форума
Эксперт С++
16421 / 7396 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
21.07.2015, 15:45 2
Лучший ответ Сообщение было отмечено Yodas как решение

Решение

Цитата Сообщение от Yodas Посмотреть сообщение
не могу найти функций которая по id процесса может вывести имя exe как в диспетчере задач нашел только как выводить путь до exe
C++
1
2
3
string ExeName = &exename[0]; // exename получен у GetModuleFileNameEx.
string::size_type const iLastSlash = ExeName.find_last_of("\\/");
ExeName = ExeName.substr(iLastSlash + 1); // В ExeName будет имя exe.
Ну и обработка ошибок в Вашем коде, мягко говоря, страдает. Все нужно проверять:
что OpenProcess вернула не NULL, что GetModuleFileNameEx вернула значение, которое
больше нуля и меньше размера буфера и т.д. Хэндл, который возвращает OpenProcess,
нужно обязательно закрывать функцией CloseHandle, иначе утечка ресурсов.
И PROCESS_ALL_ACCESS там вовсе не нужен, достаточно PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ.

На Vista и выше можно использовать QueryFullProcessImageName, для нее вообще
достаточно прав доступа PROCESS_QUERY_LIMITED_INFORMATION.

А еще GetWindowThreadProcessId в последний аргумент пишет id процесса, а
не потока, как можно было бы подумать из кода.
0
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 26
21.07.2015, 17:29  [ТС] 3
Может еще подскажешь почему некоторые процессы такие как удаленный рабочий стол в логе вместо пути отбивает либо "?" или "А"
0
Ушел с форума
Эксперт С++
16421 / 7396 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
21.07.2015, 19:06 4
Потому что в буфере мусор.
Например, OpenProcess не смогла открыть процесс - вернула NULL.
Значит, GetModuleFileNameEx тоже не отработает. В итоге в буфере
exename будет неизвестно что.
0
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 26
22.07.2015, 11:33  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Потому что в буфере мусор.
Например, OpenProcess не смогла открыть процесс - вернула NULL.
Значит, GetModuleFileNameEx тоже не отработает. В итоге в буфере
exename будет неизвестно что.
Так вроде что то понял только вот как обработку как написать если оно мне возвращает не то что надо и что делать если оно мне возвращает не то что надо.Пока в нете только GetLastError нашел только что с полученными ошибками делать тоже туго понимаю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2015, 11:33

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как узнать Handle или PID процесса, зная его имя и класс?
Как узнать Handle или PID процесса, зная его имя и класс?

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

Узнать ip-адрес компьютера по сети, зная его имя в сети
Ребята подскажите, пожалуйста, по такому вопросу. Как можно узнать ip-адрес компьютера в сети зная...

Как, зная Handle окна программы, определить имя EXE
Добрый вечер, вот такая проблема: нужно найти имя активного окна. Handle узнаётся с помощью...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.