请教大虾:如何知道系统当前所有运行的程序,怎么样可以选择性的关闭某个选中的程序(150分)

  • 主题发起人 主题发起人 kklf
  • 开始时间 开始时间
K

kklf

Unregistered / Unconfirmed
GUEST, unregistred user!
如何知道系统当前所有运行的程序?
怎么样可以选择性的关闭某个选中的程序?
对不起本人对delphi 刚刚入门,请大虾,给点例子,谢谢了。
 
ProcessFirst、ProcessNext可以找出正在运行的进程、在kernal.dll模块中
找到进程后可PostMessage发送退出消息
 
是的。 可是怎么使用这些函数呢?
 
当你上班时想安静下来好好的编写程序时,偏偏有人故意捣乱似的大声地放着CD,而且还不停地重复放着同一首歌,怎么办,Beat it! 以下这段程序演示了如何寻找一个正在运行的程序,得到程序句柄并发送按键消息给它,十分简单,大家不用客气,尽可举一反三。
procedure TForm1.Timer1Timer(Sender: TObject);
Var
 wh:Integer;
begin
  wh:=FindWindowA('SJE_CdPlayerClass','CD 播放器'); //得到句柄
  If Wh<>0 then
  SendMessage(wh,WM_COMMAND,$03EA,0);   //发送按键消息给STOP按钮
end;

//希望有用
 
Easy
用GetWindow函数可以找出内存中所有的进程
例如:
var PreHwnd,CurHwnd:HWND;
begin
CurHwnd:=Handle;
while CurHwnd<>NULLdo
begin
PreHwnd:=CurHwnd;
//在此加上自己的处理
{
例如用GetWindowText函数取得窗口的标题
如果该窗口的标题是你要关闭的
通过SendMessage函数向该窗口发送一个
WM_QUIT 或WM_DESTROY关闭它
}
CurHwnd:=GetWindow(PrehWnd,GW_HWNDNEXT);
end;
end;
 
uses tlhelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while bdo
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1do
begin
if me.th32ModuleID=pe.th32ModuleID then
listbox1.Items.Add(me.szExePath);
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;

end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm,hdd,ppp:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while bdo
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1do
begin
if StrComp(pe.szExeFile,PChar('C:/PROGRAM FILES/MICROSOFT
OFFICE/OFFICE/WINWORD.EXE'))=0 then
begin
ppp := OpenProcess(PROCESS_ALL_ACCESS, FALSE,
pe. th32ProcessID);
TerminateProcess(ppp,0);
end;
if me.th32ModuleID=pe.th32ModuleID then
begin
listbox1.Items.Addobject(me.szExePath,TObject(hp));
end;
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;
end;
 
首先谢谢各位, 可能是我没有说明白,对不起。。
我是想取出当前系统进程 但我不知道当前系统都有什么程序在运行
在举个例子,比如我要取出当前系统打开的ie数量和每个ie 窗口的句柄
然后关毕所有的ie窗口。(以为ie浏览的网页不同所以他的窗口标题也不一样
用spy++看到ie 的call name 但给他发关闭消息"sendmessage(hd,wm_close,0,0)
时 ie 并不关闭) 请教了。
 
1.找出所有正在运行的程序
procedure TForm1.Button1Click(Sender: TObject);
var
pTask : pTaskEntry;
Task : bool;
Pstr : array [0..79] of Char;
Str : string[80];
byt_j : byte;
begin
ListBox1.Clear;
GetMem(pTask, SizeOf(TTaskEntry));
pTask^.dwSize:=SizeOf(TTaskEntry);
byt_j:=0;
Task:=TaskFirst(pTask);
While Taskdo
begin
inc(byt_j);
Str:=StrPas(pTask^.szModule);
Listbox1.Items.Add(Str);
Task:=TaskNext(pTask);
end;
Label1.Caption:=IntToStr(byt_j)+ ' tasks found';
end;
2.关闭外部应用程序
var
HWndCalculator : HWnd;
begin
// find the exist calculator window
HWndCalculator := Winprocs.FindWindow(nil, '计算器');
// close the exist Calculator
if HWndCalculator <> 0 then

SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
end;

 
发送WM_CLOSE有可能不能关闭窗口,发送WM_DESTROY应该可以。用我上面说的方法
可以找出系统中所有的进程。
 
是的。wm_close和wm_destroy我都用过,但对ie 不灵 是不是ie 和windows 结合
的很深的原因。 我就是想关闭ie 用wm_close pc喇叭叫一声后就 没有什么动作了。
用wm_destroy ie 的窗口变成了个空的表单,但还不不能关闭。
 
kklf:下面程序能否大道你的要求:
procedure TForm1.Button1Click(Sender: TObject);
VAR
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm,hdd,ppp:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while bdo
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1do
begin
if me.th32ModuleID=pe.th32ModuleID then
begin
listbox1.Items.AddObject(me.szExePath,Tobject(pe.th32ProcessID));
end;
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
pe:PROCESSENTRY32;
PPP:Thandle;
begin
pe.th32ProcessID:=Cardinal(listbox1.Items.Objects[listbox1.ItemIndex]);
ppp:=OpenProcess(PROCESS_ALL_ACCESS, FALSE,
pe. th32ProcessID);
TerminateProcess(ppp,0);
listbox1.Items.Delete(listbox1.ItemIndex);
end;

 
请问:hsw
PTaskEntry在那一个单元中,我真莫们找到
用FindWindow的第二个参数怎么确定,不同进程可否有相同标题的窗口
 
type
EnumWindowsProc=function(hwnd:Thandle;
lP:LPARAM):boolean;stdcall;

function EnumWin(hwnd:Thandle;
lP:LPARAM):boolean;stdcall;
var
buffer:array[0..255] of Char;
list:TListBox;
begin
List:=TListBox(lp);
GetwindowText(hwnd,buffer,256);
if StrLen(buffer)>0 then
begin
list.Items.AddObject(buffer,Tobject(hwnd));
end;
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
PPP:Thandle;
begin
ppp:=THandle(Listbox1.Items.Objects[listbox1.ItemIndex]);
PostMessage(ppp,WM_Close,0,0);
listbox1.Items.Delete(listbox1.ItemIndex);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
pp:EnumWindowsProc;
begin
pp:=MakeProcInstance(@ENumWin,HInstance);
EnumWindows(@pp,lparam(Listbox1));
FreeProcInstance(@pp);
end;

 
to kklf:
你说“是的。wm_close和wm_destroy我都用过,但对ie 不灵 ”
我想你用的是 SendMessage 来发送消息,SendMessag确实不行
不过用 PostMessage 来发送 WM_CLOSE 消息就可以关闭它了
PostMessage(hWnd, WM_CLOSE, 0, 0) 就可以关闭的
 
不知道大家对这两个api注意到没有?
sendmessage和postmessage的效果是不同的
sendmessage直接把一个消息发送给窗口程序,等消息处理后才返回
postmessage是把消息发送到消息队列,然后立即返回
Ie可能对外来消息的窗口消息,屏蔽掉了,不处理.
 
谢谢各位大虾 ,可是我试过了, 还是没有办法关闭ie的窗口,麻烦各位
可不可以,帮我试试,怎么样关闭打开的ie窗口。(打开的窗口数量不定)
感谢了。
 
kklf:我的最后一段代码能关闭不同的标题的ie窗口,但是他列出了运行进程的
所有窗体,所以显示了一大堆乱七八糟的东西,用Process32first虽然能关闭ie
但不能却定说关闭的是哪一个ie,hsw用的TaskFirst怎样声明,能告诉我吗
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
EnumWindowsProc=function(hwnd:Thandle;
lP:LPARAM):boolean;stdcall;
type
TForm4 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure ListBox1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function EnumWin(hwnd:Thandle;
lP:LPARAM):boolean;stdcall;
var
Form4: TForm4;
implementation
{$R *.DFM}
function EnumWin(hwnd:Thandle;
lP:LPARAM):boolean;stdcall;
var
buffer:array[0..255] of Char;
list:TListBox;
begin
List:=TListBox(lp);
GetwindowText(hwnd,buffer,256);
if StrLen(buffer)>0 then
begin
list.Items.AddObject(buffer,Tobject(hwnd));
end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
pp:EnumWindowsProc;
begin
pp:=MakeProcInstance(@ENumWin,HInstance);
EnumWindows(@pp,lparam(Listbox1));
FreeProcInstance(@pp);
end;

procedure TForm4.ListBox1DblClick(Sender: TObject);
var
PPP:Thandle;
begin
ppp:=THandle(Listbox1.Items.Objects[listbox1.ItemIndex]);
PostMessage(ppp,WM_Close,0,0);
listbox1.Items.Delete(listbox1.ItemIndex);
end;

end.

 
后退
顶部