Suryakant Turing Ответов: 3

как захватить все запущенные приложения из Диспетчера задач windows


Привет,
Я работаю над проектом на c++(code:: blocks), чтобы получить список всех запущенных приложений в windows(а не процессов), как и на вкладке Приложения диспетчера задач. И я использую код ниже
#include <windows.h>    //windows.h
#include <stdio.h>  //stdio.h
#include <tchar.h>  //tchsr.h
#include <psapi.h>  //psapi.h
#include <iostream>  //iostream

using namespace std;

 HWND g_HWND = NULL;            
 TCHAR lpstring[500];
 HWND hwnd;
 
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM processID)
{
	DWORD lpdwProcessId;
	g_HWND = NULL;
	int nmax;
	if(IsWindowVisible(hwnd))
	{
	    GetWindowThreadProcessId(hwnd, &lpdwProcessId);
	    GetWindowText(hwnd, lpstring, nmax);



	  if (lpdwProcessId == processID)
	   {
		 g_HWND=hwnd;
		 return FALSE;
	   }
	}
	return TRUE;
}

void PrintProcessNameAndID(DWORD processID)
{
	TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);

	DWORD pass = 0;
	DWORD processIDReturn = -1;

	if (NULL != hProcess)
	{
		HMODULE hMod;
		DWORD cbNeeded;

		if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
			pass = GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
	}

	EnumWindows(EnumWindowsProc, processID);

	if ((g_HWND != NULL) && (pass != 0))
	{
		if(!_tcsstr(_T("Start""Program Manager"),lpstring))
        {
            _tprintf(TEXT("%s (PID: %u)\n\n"),lpstring,processID);             
        }
	}
	CloseHandle(hProcess);
}

int main(void)
{
	DWORD aProcesses[1024], cbNeeded, cProcesses;
	unsigned int i;

	if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
		return 1;

	cProcesses = cbNeeded / sizeof(DWORD);

	for (i = 0; i < cProcesses; i++)
	{
		if (aProcesses[i] != 0)
		{
			PrintProcessNameAndID(aProcesses[i]);
		}
	}

	return 0;
}

Но этот код читает только " подпись "и,следовательно,не читает такие приложения, как"мой компьютер", имя папки, Norton antivirus и многие другие приложения без подписи.

Пожалуйста, помогите мне получить название этих приложений тоже.Я очень устал от этого за последние три месяца и очень хочу закончить это.

Спасибо Вам в предвкушении
сурьякант

3 Ответов

Рейтинг:
2

Michael Haephrati

Использовать этот код:

HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


Рейтинг:
1

Dave Kreskowiak

Ваши перечисляющие окна, а не процессы. Вы получаете окно, а затем получаете процесс, который его создал. Конечно, это не весь процесс, потому что не каждый процесс создает окно.

Есть пример, который делает именно то, о чем вы говорите здесь[^].


Suryakant Turing

Спасибо, Дэйв, но, пожалуйста, ты можешь сказать мне, что делать после того, как я получу все запущенные процессы. Потому что мне нужны только "запущенные приложения(или-> запущенное приложение, которое имеет окно на экране моего ноутбука)", как на вкладке Приложения Диспетчера задач Windows, а не запущенные процессы.

Dave Kreskowiak

Хорошо, в этом случае это процессы, которые запускаются и выполняются от имени пользователя. Воспользуйся Функция OpenProcessToken (Windows)[^] к маркеру безопасности, под которым был запущен процесс, использование Функция GetTokenInformation (Windows)[^] с флагом TokenOwner, установленным на SID владельца (пользователя). Затем вы можете позвонить Функция LookupAccountSid (Windows)[^] чтобы получить счет Сида. Если учетная запись совпадает с учетной записью текущего вошедшего пользователя, то пользователь запустил этот процесс, который вы называете приложением.

Suryakant Turing

Дэйв посмотри что у меня есть,
#include<iostream>/ / iostream
#включать<окошек.ч&ГТ; //окна.ч
#include< stdio.h> / / stdio.h
#включать<в файле TCHAR.ч&ГТ; //в файле TCHAR.ч
#include< psapi.h> / / psapi.h

использование пространства имен std;

TCHAR lpstring[500];
Его hwnd hwnd элемента ;

БООЛ обратного вызова EnumWindowsProc(его hwnd hwnd элемента, параметр lparam lparam должен);


тап_п()
{
EnumWindows(EnumWindowsProc, NULL);
возвращает 0;
}


БООЛ обратного вызова EnumWindowsProc(его hwnd hwnd элемента, параметр lparam lparam должен)
{

char class_name[80];
char title[80];

Типа DWORD lpdwProcessId;

int nmax;
if (IsWindowVisible(hwnd))
{

GetWindowText(hwnd, lpstring, nmax);
if (! _tcsstr(_T ("Start" "Program Manager"), lpstring))
_tprintf(текст("%с (ID процесса: %U в)\н\н"),lpstring,то lparam);

}

вернуть true;
}

Я свернул свой код и получил все приложения, как в диспетчере задач. Все работает нормально, кроме:-
1. Проигрыватель Windows Media (прослеживается 4 раза)
2. я хочу сделать эту программу динамической, то есть всякий раз, когда я открываю приложение, оно должно автоматически отображаться на консоли, не запуская его снова и снова.
Скажите мне.
Спасибо

Dave Kreskowiak

Я дал вам ссылки на документацию по этим функциям не просто так. Не мне было заниматься вашим исследованием этих функций и структур, которые они используют для вас.

Suryakant Turing

Я согласен, но они не могут дать мне динамический контроль, как я хочу.

Dave Kreskowiak

Итак, я понятия не имею, что вы подразумеваете под "динамическим контролем". Это бессмысленный термин.

Если вы хотите, чтобы приложение запускалось при входе в систему, запустите его из клавиша Run[^].

Рейтинг:
0

Sergey Alexandrovich Kryukov

В дополнение к решению 1:

Для перечисления процессов можно использовать следующие функции Process32First, Process32Next
Process32First функция (Windows)[^],
Функция Process32Next (Windows)[^].

См. Также эту статью CodeProject для получения более подробной информации: Перечисление процессов: практический подход[^].

—СА


Suryakant Turing

Спасибо Сергею, но, как я уже указывал в своем вопросе, мне нужны только "текущие запущенные приложения", как мы видим на вкладке "приложение Диспетчера задач Windows", а не "процессы".

Sergey Alexandrovich Kryukov

Ну и что? Это то, что дает вам API. Выберите то, что вам нужно. :-)
—СА