How to get applications from the Windows task manager (Applications tab) + their location on the hard drive from Delphi

I would like to get a list of running and visible programs in the Windows Application Manager (the "Processes" tab) and get their location on the hard drive?
I need this to be done in Delphi. Can anybody help?

+4
source share
2 answers

As far as I know, the Applications tab in the Task Manager is a list of top-level windows that do not belong to other windows, do not have a parent element, and are not tool windows. In my Process Information , I have a unit called AppInfo.pas that returns a list of windows with such characteristics, and the list matches what you see in the task manager. Here is the bulk of the code that is written as a callback function for the EnumWindows API function:

{$IFDEF DELPHI2007UP} class function TAppWindowCollection.EnumWinProc(wHandle: HWND; lparam: integer): Bool; {$ELSE} function EnumWinProc(wHandle: HWND; lparam: integer): Bool; stdcall; {$ENDIF} Const MAX_TEXT = MAX_PATH; var WindowItem : TWindowItem; strText,strClass : array [0..MAX_TEXT] of char; IsAppMainWin : Boolean; begin //Check if the window is a visible application main window. IsAppMainWin := IsWindowVisible(wHandle) AND //Visible (GetWindow(wHandle,GW_OWNER) = 0) AND //Not owned by other windows (GetParent(wHandle) = 0) AND //Does not have any parent (GetWindowLong(wHandle,GWL_EXSTYLE) AND WS_EX_TOOLWINDOW = 0); //Not a tool window if IsAppMainWin then begin WindowItem := TAppWindowCollection(lparam).Add; GetWindowText(wHandle,strText,MAX_TEXT); GetClassName(wHandle,strClass,MAX_TEXT); WindowItem.FCaption := strText; WindowItem.FHandle := wHandle; WindowItem.FWindowClass := strClass; GetWindowThreadProcessId(wHandle,WindowItem.FProcessID); end; Result := True; end; 

For complete source code, you can refer to AppInfo.pas .

and get their hard drive space

These are just windows. If you want to get the path to the EXE file corresponding to each element, you first need to find the process that owns this window using the GetWindowThreadProcessID API function. This is what I did in the above code. When you have a process identifier, you can get a process descriptor from it and list its modules. The first module is the main EXE file. I implemented this in my TProcessInfo component, which is included in the same package with AppInfo.pas.

+3
source

Here is a complete standalone solution (no more broken links)

 program ApplicationList; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Winapi.Windows, Winapi.PsAPI; function GetPathFromPID( const PID : cardinal ) : string; var hProcess : THandle; path : array [0 .. MAX_PATH - 1] of char; begin hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID ); if hProcess <> 0 then try if GetModuleFileNameEx( hProcess, 0, path, MAX_PATH ) = 0 then RaiseLastOSError; Result := path; finally CloseHandle( hProcess ) end else RaiseLastOSError; end; function EnumWinProc( wHandle : hWnd; lparam : integer ) : Bool; stdcall; Const MAX_TEXT = MAX_PATH; var strText, strClass : array [0 .. MAX_TEXT] of char; strPath : string; IsAppMainWin : Boolean; ProcId : cardinal; begin // Check if the window is a visible application main window. IsAppMainWin := IsWindowVisible( wHandle ) AND // Visible ( GetWindow( wHandle, GW_OWNER ) = 0 ) AND // Not owned by other windows ( GetParent( wHandle ) = 0 ) AND // Does not have any parent ( GetWindowLong( wHandle, GWL_EXSTYLE ) AND WS_EX_TOOLWINDOW = 0 ); // Not a tool window if IsAppMainWin then begin GetWindowText( wHandle, strText, MAX_TEXT ); GetClassName( wHandle, strClass, MAX_TEXT ); GetWindowThreadProcessID( wHandle, ProcId ); try strPath := GetPathFromPID( ProcId ); except strPath := '???'; end; WriteLn( ProcId, ' - ', strClass, ' - ', strText, ' - ', strPath ); end; Result := True; end; procedure DoEnumWindows; var FirstWnd : cardinal; begin EnumWindows( @EnumWinProc, cardinal( @FirstWnd ) ); end; begin try DoEnumWindows; except on E : Exception do WriteLn( E.ClassName, ': ', E.Message ); end; ReadLn; end. 
+2
source

All Articles