如何检测特定的程序是否执行?(35分)

  • 主题发起人 主题发起人 sfxwing
  • 开始时间 开始时间
S

sfxwing

Unregistered / Unconfirmed
GUEST, unregistred user!
就是检测某个.exe文件是否正在执行,我现在的做法是用process32first
和process32Next列出进程表再一个个的检查,但是这样找不出16位进程
(就是在NT下ndvdm掩模下执行的)。谁知道更好的办法?最好是在98和
NT下都有效的
 
如果他有窗口就找他的窗口?
 
要检测的EXE文件的一些特征是知道的吧?
根据特征找其HANDLE
 
如果有窗口,试试FindWindow
 
FindWindow找的是窗口的标题吧?我是要在主程序检测一大批程序,标题
是不规律的,唯一有规律的特征就是执行文件名
 
还有,我是在主程序中调用这些.exe文件的,原来用delphi1时有个
函数GetModuleUsage,我是这样用的:
ExeInst:=WinExec(pCmdLine,SW_SHOWNORMAL);
while GetModuleUsage(ExeInst) > 0 do
Application.ProcessMessages
现在delphi4,5里没有这个函数了,有没有
类似的方法?谁能说详细一点?
 
分数太少了!


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function FindWindowLike(Level:integer;hWndStart:HWND;WindowText:string;WindowClass:string):HWND;
var
hwndLike:HWND;
WndCaption:array[0..254] of char;
WndClassName:array[0..254] of char;
begin
if level=0 then
if hWndStart=0 then hWndStart:=GetDesktopWindow;
level:=level+1;
hwndLike:=GetWindow(hWndStart,GW_CHILD);
while hwndLike<>0 do
begin
FindWindowLike(level,hwndLike,WindowText,WindowClass);
GetWindowText(hwndLike,@WndCaption,254);
GetClassName(hwndLike,@WndClassName,254);
if pos(WindowText,StrPas(WndCaption))<>0 then
if ((pos(WindowClass,StrPas(WndClassName))<>0) or (WindowClass='')) then
begin
form1.Memo1.Lines.Add(StrPas(WndCaption));
form1.Memo1.Lines.Add(StrPas(WndClassName));
form1.Memo1.Lines.Add(inttostr(hwndlike));
form1.Memo1.Lines.Add(StrPas('------------'));
FindWindowLike:=hwndLike;
end; //end if ÕÒµ½Æ¥Åä´°¿ÚÃû³ÆÓëÀàÃû»ò´°¿ÚÃû³ÆÆ¥Åä

hwndLike:=GetWindow(hwndLike,GW_HWNDNEXT);
end;
level:=level-1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
FindWindowLike(0,0,Edit1.Text,Edit2.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
hwndclose:HWND;
begin
hwndclose:=FindWindowLike(0,0,Edit1.Text,Edit2.Text);
PostMessage(hwndclose,WM_CLOSE,0,0 );
end;

procedure TForm1.Button3Click(Sender: TObject);
var
hwndtoshow:HWND;
begin
hwndtoshow:=FindWindowLike(0,0,'´ó¸»ÎÌ',Edit2.Text);
SetForegroundWindow(hwndtoshow);
ShowWindow(hwndtoshow, SW_RESTORE);
hwndtoshow:=FindWindowLike(0,0,'ÏÔʾÎÊÌâ',Edit2.Text);
SetForegroundWindow(hwndtoshow);
ShowWindow(hwndtoshow, SW_RESTORE);

end;

end.
 
接受答案了.
 
后退
顶部