chu*_*byk 5 delphi taskmanager
我想获取正在Windows任务管理器的“应用程序”选项卡(而非“进程”选项卡)中运行且可见的程序列表,并获取它们在HDD上的位置?
我需要在Delphi中完成。有人可以帮忙吗?
据我所知,任务管理器中的“应用程序”选项卡是顶级窗口的列表,这些窗口不属于其他窗口,没有父窗口,也不是工具窗口。在我的Process Info中,我有一个名为 AppInfo.pas 的单元,它返回具有此类特征的窗口列表,并且该列表与您在任务管理器中看到的内容相匹配。以下是作为 EnumWindows API 函数的回调函数编写的代码的主要部分:
{$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;
Run Code Online (Sandbox Code Playgroud)
完整的源代码可以参考AppInfo.pas。
并获取他们在硬盘上的位置
这些只是窗户。如果要获取每个项目对应的 EXE 文件的路径,您应该首先使用GetWindowThreadProcessID API 函数找到拥有该窗口的进程。这就是我在上面的代码中所做的。获得进程 ID 后,您可以从中获取进程句柄,并枚举其模块。第一个模块是主 EXE 文件。我在 TProcessInfo 组件中实现了该组件,该组件与 AppInfo.pas 包含在同一包中。