Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8

Вывести на экран список окон верхнего уровня (с указанием родительского процесса)

19.12.2012, 17:21. Показов 2345. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вывести на экран список окон верхнего уровня и у каждого окна указать какому процессу оно принадлежит.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2012, 17:21
Ответы с готовыми решениями:

Вывести на экран список слов с указанием их длины
1. Задан текст, состоящий из отдельных слов. Длина текста - не более 80 символов. Исходный текст должен заканчиваться символом (’.’, ’!’,...

Вывести на экран список абонентов с указанием номеров телефонов
Я только учусь писать код, не судите пожалуйста строго Задан массив структур «Абонент» (фамилия; домашний адрес; номер телефона; тариф;...

Получить список, элементами которого будут являться только атомы верхнего уровня
1. Из заданного списка получить список, элементами которого будут являться только атомы верхнего уровня. (2 (а е) 4 ((5) у) с) -> (2 4...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
19.12.2012, 18:15
Delphi
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
program Test;
uses
  Windows, Messages, SysUtils;
 
const
  WndClass   = 'TWindow';
  WndCaption = 'Top-Level Windows List';
 
var
   listbox : HWND;
 
function GetProcessImageFileName(hProcess:THandle; lpImageFileName:LPTSTR; nSize:DWORD):DWORD; stdcall;
   external 'PSAPI.dll' name 'GetProcessImageFileNameW'; // или GetProcessImageFileNameA, смотря какая Дельфи
 
// Эта функция по PID получает название EXE-файла процесса
function GetProcessFileName(PID : DWORD) : string;
var
   hProcess : THandle;
   sProcessName : array[0 .. MAX_PATH] of Char;
begin
   Result := '';
   // Для начала откроем процесс для получения информации
   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, PID);
   if hProcess <> 0 then
   begin
      // Удалось открыть? Тогда получаем нужную информацию об имени файла
      if GetProcessImageFileName(hProcess, @sProcessName, MAX_PATH) = 0 then
      begin
         // Не получилось вытащить имя файла, сообщаем об ошибке и выходим
         MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error !', MB_ICONERROR or MB_OK);
         CloseHandle(hProcess); // Это я забыл сделать, тоже нужно закрыть процесс, который был открыт
         Exit;
      end;
      // Все нормально, полный путь к файлу получен, вернем само имя, откинув директории
      Result := ExtractFileName(sProcessName);
 
      // Не забываем закрыть процесс
      CloseHandle(hProcess);
   end;
end;
 
// Найдено новое окно верхнего уровня - приходим сюда. В MyHwnd передается его хендл
function ListWindows(MyHwnd : HWND; Lp : LPARAM) : BOOL; stdcall;
var
   sClass : array[0 .. MAX_PATH] of Char;
   sCaption : array[0 .. MAX_PATH] of Char;
   s : string;
   PID : DWORD;
begin
   // Если найденное окно - видимое
   if IsWindowVisible(MyHwnd) then
   begin
      // получаем его класс, содержимое заголовка, и находим, какому процессу оно принадлежит (PID)
      GetClassName(MyHwnd, sClass, MAX_PATH);
      SendMessage(MyHwnd, WM_GETTEXT, MAX_PATH, LPARAM(@sCaption));
      GetWindowThreadProcessId(MyHwnd, PID);
 
      // По номеру процесса определяем имя файла в GetProcessFileName
      s := Format('Class = %s, Caption = %s, PID = %d, Process : %s',
         [sClass, sCaption, PID, GetProcessFileName(PID)]);
      // И добавляем информацию об этом окне в ListBox.
      SendMessage(listbox, LB_ADDSTRING, 0, lparam(@s[1]));
   end;
   Result := True; // Продолжать искать дальше
end;
 
 
function WindowProc(Wnd : HWND; Msg, wParam, lParam : Integer) : Integer ; stdcall;
begin
  case Msg of
    WM_DESTROY:
    begin
      PostQuitMessage(0);
      Result := 0;
      Exit;
    end;
  else
    Result := DefWindowProc(Wnd, Msg, wParam, lParam)
  end;
end;
 
var
  Wnd   : HWND;
  WC    : TWndClassEx;
  Msg   : TMsg;
begin
  FillChar(WC, SizeOf(TWndClassEx), 0);
  WC.cbSize        := SizeOf(WC);
  WC.style         := CS_HREDRAW or CS_VREDRAW;
  WC.lpfnWndProc   := @WindowProc;
  WC.hInstance     := hInstance;
  WC.hIcon         := LoadIcon(0, IDI_APPLICATION);
  WC.hCursor       := LoadCursor(0, IDC_ARROW);
  WC.hbrBackground := COLOR_WINDOW;
  WC.lpszMenuName  := NIL;
  WC.lpszClassName := WndClass;
 
  RegisterClassEx(WC);
 
  // Создаем главное окно приложения
  Wnd := CreateWindowEx(0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                        250, 60, 800, 200, 0, 0, hInstance, NIL);
  // Показываем его
  ShowWindow(Wnd, SW_SHOWNORMAL);
 
  // На окне создаем ListBox, в который будем записывать результаты
  listbox := CreateWindowEx(WS_EX_CLIENTEDGE, 'ListBox', '', LBS_STANDARD or WS_CHILD or WS_VISIBLE,
                            0, 0, 790, 160, Wnd, 0, hInstance, NIL);
  // Выставляем этому ЛистБоксу стандартный шрифт, чтоб не был этот ужасный, который выставляет система
  SendMessage(listbox, WM_SETFONT, WPARAM(GetStockObject(DEFAULT_GUI_FONT)), 1);
 
  // Перечисляем все окна верхнего уровня. При этом для каждого найденного
  // такого окна работает Callback-функция ListWindows
  EnumWindows(@ListWindows, LPARAM(0));
 
  // Это очередь сообщений, чтобы программа вообще заработала
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
 
  Halt(Msg.wParam);
end.
1
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8
19.12.2012, 19:29  [ТС]
не могли бы вы пояснить код выполнения программы...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
19.12.2012, 19:42
Комментарии добавлены.
1
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8
19.12.2012, 22:26  [ТС]
БОЛЬШОЕ СПАСИБО

Добавлено через 31 минуту
еще вопрос. Почему не выводит к какому процессу принадлежит окно?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
20.12.2012, 00:24
Что значит "не выводит"? Всё выводит:
Миниатюры
Вывести на экран список окон верхнего уровня (с указанием родительского процесса)  
1
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8
20.12.2012, 01:09  [ТС]
да... извените...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2012, 01:09
Помогаю со студенческими работами здесь

Чтение XML. Составить список тегов второго уровня с указанием количества <DVD>
Здравствуйте, помогите начинающему в решении задачи. Исходный XML-файл - dvd.xml 1. Составить список тегов второго уровня с...

Вывести в текстовый файл список свойств процесса, возвращаемый командлетом Get-process и на экран - их общее количество
Здравствуйте, требуется помощь с задачами, которые нужно выполнить в PowerShell Вывести в текстовый файл список свойств процесса,...

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

Как вывести все заголовки окон одного процесса
Столкнулся с тем, что один процесс порождает несколько окон. Мне нужно вывести заголовки каждого из них, но выводится только активный на...

Вывести список ВСЕХ работников, с указанием их руководителя
Вывести список ВСЕХ работников, с указанием их руководителя. Сделать тоже самое, но в порядке иерархической подчиненности. SELECT ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru