如何在Windows中获取当前进程列表 [英] How to get the current process list in windows
本文介绍了如何在Windows中获取当前进程列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图显示系统上当前正在运行的所有进程. 谁能指导我做到这一点.
I'm trying to show all processes which are currently running on my system. Can any one guide me to do that.
推荐答案
我将WMI用于此任务,因为WMI还可列出我认为Windows API方式无法执行的64位进程.这是使用 Win32_Process
类以查询正在运行的进程的列表:
I would use WMI for this task since WMI can list also 64-bit processes which I think the Windows API way cannot. Here is an example which uses the Win32_Process
class to query list of running processes:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Code]
const
WM_SETREDRAW = $000B;
var
ProcessList: TNewListBox;
// this is a substitution for missing BeginUpdate method
// of TStrings class
procedure WinControlBeginUpdate(Control: TWinControl);
begin
SendMessage(Control.Handle, WM_SETREDRAW, 0, 0);
end;
// this is a substitution for missing EndUpdate method
// of TStrings class
procedure WinControlEndUpdate(Control: TWinControl);
begin
SendMessage(Control.Handle, WM_SETREDRAW, 1, 0);
Control.Refresh;
end;
function GetProcessNames(Items: TStrings): Integer;
var
I: Integer;
WQLQuery: string;
WbemLocator: Variant;
WbemServices: Variant;
WbemObject: Variant;
WbemObjectSet: Variant;
begin
Result := 0;
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemServices := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
WQLQuery := 'SELECT Name FROM Win32_Process';
WbemObjectSet := WbemServices.ExecQuery(WQLQuery);
if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
begin
Items.Clear;
for I := 0 to WbemObjectSet.Count - 1 do
begin
WbemObject := WbemObjectSet.ItemIndex(I);
if not VarIsNull(WbemObject) then
Items.Add(WbemObject.Name);
end;
Result := Items.Count;
end;
end;
procedure RefreshButtonClick(Sender: TObject);
begin
// this try..finally block is used to reduce annoying visual effects
// when filling the list box; Inno Setup doesn't publish BeginUpdate,
// EndUpdate method pair, hence this home brewn solution
WinControlBeginUpdate(ProcessList);
try
GetProcessNames(ProcessList.Items);
finally
WinControlEndUpdate(ProcessList);
end;
end;
procedure InitializeWizard;
var
RefreshBtn: TNewButton;
ProcessPage: TWizardPage;
begin
ProcessPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
ProcessList := TNewListBox.Create(WizardForm);
ProcessList.Parent := ProcessPage.Surface;
ProcessList.SetBounds(0, 0, ProcessPage.SurfaceWidth,
ProcessPage.SurfaceHeight - 33);
RefreshBtn := TNewButton.Create(WizardForm);
RefreshBtn.Parent := ProcessPage.Surface;
RefreshBtn.Left := 0;
RefreshBtn.Top := ProcessPage.SurfaceHeight - RefreshBtn.Height;
RefreshBtn.Caption := 'Refresh';
RefreshBtn.OnClick := @RefreshButtonClick;
end;
这篇关于如何在Windows中获取当前进程列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文