如何得到系统中当前运行的所有应用程序(200分)

  • 主题发起人 主题发起人 教父
  • 开始时间 开始时间

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
就象NT的任务管理器中的应用程序页中显示的那样,我找过了类似的贴子,都没有一个
比较好的解决方法,最主要的是不能在NT下实现。
 
uses tlhelp32;

--------------
var
lppe:tprocessentry32;
sshandle:thandle;
found:boolean;
begin
sshandle:=createtoolhelp32snapshot(th32cs_snapail,0);
found:=process32first(sshandle,lppe);
while found do
begin
//进行你的处理其中lppe.szExefile就是程序名。
found:=proccess32next(sshandle,lppe);
end;
end;

//线程用Thread32First,Thread32Next
//模块用Module32First,Module32Next
//堆用Heap32First,Heap32Next
//可执行文件用process32first

 
这个是应用程序列表。
var
Form1: TForm1;
Wnd: HWND;
implementation

{$R *.DFM}

Function EnumWindowsProc (Wnd: HWND; lb: TListbox): BOOL; stdcall;
var
caption: Array [0..128] of Char;
begin
Result := True;
if { skip invisible windows }
IsWindowVisible(Wnd) and
{ only process truly top-level windows. GetWindowLong must be used, not
GetParent }
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and
{ skip WS_EX_TOOLWINDOW windows }
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
then begin
SendMessage( Wnd, WM_GETTEXT, Sizeof( caption ), integer(@caption));
lb.Items.AddObject( caption, TObject( Wnd ));
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.clear;
EnumWindows( @EnumWindowsProc, integer( listbox1 ));
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
theClassname: Array [0..128] of Char;

tid, pid: DWORD;
intExitCode:DWORD;
begin
With Sender As TListbox Do Begin
If ItemIndex >= 0 Then Begin
Wnd:= HWND(Items.Objects[ itemindex ]);
If Wnd <> 0 Then Begin
Windows.GetClassname( Wnd, theClassname, Sizeof( classname ));
tid := GetWindowThreadProcessID( Wnd, @pid );
label1.caption :=
Format(
'HWND: %8.8x'#13#10+
'Class: %s'#13#10+
'Process ID: %8.8x'#13#10+
'Thread ID: %8.8x',
[Wnd, theClassname, pid, tid] );
End;
End;
End;
end;
 
Del_Sun的方法并不能在NT下使用。
bubble的方法基本上没有问题了,但是加了
{ skip WS_EX_TOOLWINDOW windows }
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
之后,QQ不会显示出来,去掉这一句又会出现一些其它不想要的东西,有没有办法去掉
一些不想要的窗体?如果实在没有办法就算了。 :)
 
sorry 我用的win2000,开了foxmail和金山此吧及毒吧
(它们都在进程里面而不是应用程序里面),
只要在托盘区的你看看应用程序里面都没有,只有在进程里面有。
 
我用的是XP,在托盘区的程序不在应用程序里我想是因为
if { skip invisible windows }
IsWindowVisible(Wnd)
这段代码起了作用,是任务管理器里头也可以看到QQ的,去掉
{ skip WS_EX_TOOLWINDOW windows }
((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
这一段会把系统的两个程序也给包含进来,你试试看看。
 
也行了,差不多能用了,呵呵,谢了。
 
[:(]
是的,我试验过了,最多也就能找到这些窗口了,
这个程序是遍历可以找到的顶级窗口的。
[:)]
 
我想问一下你们列出来的标题和实际窗体上的一样吗?
好象这里 lb.Items.AddObject( caption, TObject( Wnd ));得到的标题不准确哦?
有些和实际不符,
 
后退
顶部