Вопрос пользователя заключается в том, как получить список запущенных программ, отображаемых в табе "Приложения" диспетчера задач Windows, а также их расположение на жестком диске, используя язык программирования Delphi.
Решение проблемы
Для решения поставленной задачи можно использовать компонент Process Info, который включает в себя модуль AppInfo.pas. Этот модуль содержит функцию обратного вызова для перечисления окон, соответствующих требованиям диспетчера задач (неowned, без родительских окон, не являются окнами вспомогательных элементов интерфейса).
Код функции обратного вызова для перечисления окон выглядит следующим образом:
{$IFDEF DELPHI2007UP}
class function TAppWindowCollection.EnumWinProc(wHandle: HWND; lparam: integer): Bool;
{$ELSE}
function EnumWinProc(wHandle: HWND; lparam: integer): Bool; stdcall;
{$ENDIF}
// ... код проверки окна ...
if IsAppMainWin then
begin
WindowItem := TAppWindowCollection(lparam).Add;
// ... код получения текста и класса окна ...
GetWindowThreadProcessId(wHandle, WindowItem.FProcessID);
end;
Result := True;
Дополнительно, для получения пути к исполняемому файлу, необходимо сначала найти процесс, которому принадлежит окно, используя API функцию GetWindowThreadProcessID. После получения идентификатора процесса, можно перечислить модули процесса и получить путь к основному исполняемому файлу.
Альтернативный ответ
Для самостоятельной реализации решения без использования сторонних библиотек, можно использовать следующий код:
program ApplicationList;
{$APPTYPE CONSOLE}
// ... подключение необходимых модулей ...
uses
Winapi.Windows,
Winapi.PsAPI;
function GetPathFromPID(const PID: cardinal): string;
// ... реализация функции получения пути к исполняемому файлу ...
function EnumWinProc(wHandle: HWND; lparam: integer): Bool; stdcall;
// ... реализация функции перечисления окон ...
procedure DoEnumWindows;
// ... реализация процедуры перечисления окон, используемой в консольном приложении ...
begin
try
DoEnumWindows;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
Пример кода
В приведенном коде демонстрируется, как перечислить все основные окна приложений, определить их принадлежность к процессам и получить пути к исполняемым файлам этих процессов.
Выводы
Используя предложенные решения, разработчики на Delphi могут получить список запущенных программ и их расположение на жестком диске, что может быть полезно для различных приложений, требующих инспекции запущенных процессов и их взаимодействия с пользовательским интерфейсом.
Запрос пользователя состоит в необходимости получить и проанализировать информацию о запущенных программах в среде Delphi, используя функционал диспетчера задач Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS