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.
source share