Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 19:47   #1
X-F@ctor
 
Аватар для X-F@ctor
 
Регистрация: 07.06.2008
Сообщений: 4
По умолчанию диспетчер задач на WinApi

Добрый день, суть вопроса такова: имеется скелет приложения, отображающего список процессов, с возможностью выставления приоритета, убивание процессов и прочего.
Нужно передалать так, чтобы в лист боксе вместо этого отображался список открытых окон, имя класса ( окна, как я понял) и приоритет. Кроме того утилита должна закрывать выбранное окно или уничтожать процесс. Сделать это по отдельности вообщем-то не сложно, но как можно узнать список процессов запущенных окон, ведь это вообще разные классы? Это нужно будет для задания приоритета окон и закрытия процесса.
Вот черновой вариант участка кода в котором происходит вывод данных:

Код:

/Получение информации о процессе.
int ProcessesInfo(HWND hwnd,DWORD dwProcessID)
{
	PROCESSENTRY32 pe32={0};
	HANDLE myhandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	int i=0;
	h=OpenProcess(PROCESS_QUERY_INFORMATION,0,dwProcessID);
	DWORD minphmem,maxphmem;
	DWORD dw=GetPriorityClass(h);
	TCHAR s[20];
	//Отображание списка приоритетов	
	switch(dw)
	{
	case REALTIME_PRIORITY_CLASS: _tcscpy(s,"!Real time!"); break;
	case HIGH_PRIORITY_CLASS: _tcscpy(s,"High"); break;
	case NORMAL_PRIORITY_CLASS: _tcscpy(s,"Normal"); break;
	case IDLE_PRIORITY_CLASS: _tcscpy(s,"Low"); break;
	}
	i=SendMessage (hList, LB_FINDSTRING, 0,
		(LPARAM) ((LPCTSTR)s));
	SendMessage(hList,LB_SETCURSEL, i, 
        0); 
	SendMessage (hwnd, LB_RESETCONTENT, 0, 0);
	if(myhandle==INVALID_HANDLE_VALUE)
		return false;
	pe32.dwSize=sizeof(PROCESSENTRY32);
	//Поиск выбранного процесса и получение информации о нем
	if(Process32First(myhandle,&pe32))
		do{
			if(pe32.th32ProcessID==dwProcessID) break;
		}
		while(i++,Process32Next(myhandle,&pe32));

	TCHAR sz[100];
	//Отображение информации о процессе в списке
	wsprintf(sz,TEXT("Имя: %s"),pe32.szExeFile); 
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);
	
	wsprintf(sz,TEXT("ID процесса: %lu"),pe32.th32ProcessID); 
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);

	wsprintf(sz,TEXT("Кол-во потоков: %d"),pe32.cntThreads); 
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);

	wsprintf(sz,TEXT("Базовый приоритет: %d"),pe32.pcPriClassBase); 
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);
	GetProcessWorkingSetSize(h,&minphmem,&maxphmem);
	
	wsprintf(sz,TEXT("Мин/макс размер физической памяти:%lu / %lu")
		,minphmem,maxphmem); 
	
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);
	
	CloseHandle(h);
	_tcscpy(sz,TEXT("------------Модули-----------------"));
	SendMessage (hwnd, LB_ADDSTRING, 0, (LPARAM) sz);

	myhandle=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProcessID);
	if(myhandle==INVALID_HANDLE_VALUE)
		return false;
	MODULEENTRY32 me32={0};
	me32.dwSize=sizeof(MODULEENTRY32);
	
	if(Module32First(myhandle,&me32))
		do{	
			SendMessage (hwnd, LB_ADDSTRING, 0, 
				(LPARAM)me32.szExePath);
	
		}while(Module32Next(myhandle,&me32));	
		CloseHandle(myhandle);
	return true;
				
}
Расчитывая на вашу помощь, в среду сдавать курсовую по этому примеру
X-F@ctor вне форума Ответить с цитированием
Старый 24.05.2009, 17:41   #2
X-F@ctor
 
Аватар для X-F@ctor
 
Регистрация: 07.06.2008
Сообщений: 4
По умолчанию

Разобрался, как получать имя окна и имя класса ( тут без получения имени класса):
Код:
char p[200];
	
	hWindows = GetDesktopWindow(); // Получаем handle для desktop
	hWindHandl = GetWindow(hWindows, GW_CHILD); // Получаем его handle
	DWORD dwMyId;
		while (hWindHandl !=0) {//
		hWindHandl = GetWindow(hWindHandl, GW_HWNDNEXT);
		if (IsWindowVisible(hWindHandl)){
		GetWindowText(hWindHandl,p,300); // и его заголовок
		GetWindowThreadProcessId(hWindHandl, &dwMyId);
	
		SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM) p);
		h=OpenProcess(PROCESS_QUERY_INFORMATION,0,dwMyId);
	
		}
		}
Как теперь можно через хендл, полученный от Open Process получить его приоритет?
X-F@ctor вне форума Ответить с цитированием
Старый 24.05.2009, 18:05   #3
X-F@ctor
 
Аватар для X-F@ctor
 
Регистрация: 07.06.2008
Сообщений: 4
По умолчанию

Разобрался уже и с этим)) Остался один насущный вопрос: как реализовать вывод этих данных в одну строчку в лист боксе, по аналогии с виндовским диспетчером задач? Можно, конечно, сделать 3 listBox'a, в один писать имя, в другой класс окна, в третий приоритет, но это попахивает извращением. Можно лучше использовать другую какую-то форму или есть вариации записи в listBox?
X-F@ctor вне форума Ответить с цитированием
Старый 24.05.2009, 18:21   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В Диспетчере задач List View
Somebody вне форума Ответить с цитированием
Старый 24.05.2009, 19:10   #5
X-F@ctor
 
Аватар для X-F@ctor
 
Регистрация: 07.06.2008
Сообщений: 4
По умолчанию

Дело в том, что программа делается на чистом WinApi с использованием ресурсов, а среди ресурсов Win32 приложений ListView нет ( или я плохо искал)
X-F@ctor вне форума Ответить с цитированием
Старый 25.05.2009, 18:57   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Непосредственно из taskmgr.exe
Код:
110 DIALOGEX 0, 0, 393, 197, 0
STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg", 0, TRUE
{
 CONTROL "Процессы", 1009, "SysListView32", WS_BORDER | WS_TABSTOP | 0x00000005, 9, 9, 376, 131
 AUTOCHECKBOX "&Отображать процессы всех пользователей", 1008, 10, 144, 162, 10
 PUSHBUTTON "&Завершить процесс", 1010, 310, 144, 75, 14
}

Последний раз редактировалось Somebody; 25.05.2009 в 18:59.
Somebody вне форума Ответить с цитированием
Старый 28.06.2009, 00:40   #7
mar4elo
Форумчанин
 
Регистрация: 17.04.2008
Сообщений: 146
По умолчанию

Хорошо вам!!! У нас в техникуме даже неупоминали о WinApi
mar4elo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диспетчер задач. Delphi Scabby Помощь студентам 1 10.03.2009 08:34
Диспетчер задач NecRoMat Свободное общение 2 03.08.2008 16:55
диспетчер задач Istergul Общие вопросы Delphi 3 10.02.2008 00:23
Диспетчер задач Windows komex Win Api 14 29.01.2007 20:34