如何知道一个外部程序被用户激活运行 ?(80分)

  • 主题发起人 主题发起人 new
  • 开始时间 开始时间
你的问题和下面相同:

想知道当前有哪些程序在内存中运行,类似于“结束任务”中
的任务列表。如何实现?16位的GetCurrentTask()和
GetWindowTask()不能使用了,那么32位API中的
GetCurrentThread()、GetCurrentProcess()和
GetWindowThreadProcessId()等函数又是如何使用的,请高手
赐教,先谢了。




来自:aimingoo
时间:98-9-9 05:19:40
ID:1621
参照下面这段程序,就搞定了啦。^-^
==================================
uses ... TLHelp32, ...

type
TForm1 = class(TForm)
...
end;

var
Form1: TForm1;
l : Tlist; ////返回的东东在"L"这个TList中。

type
TProcessInfo = Record
ExeFile : String;
ProcessID : DWORD;
end;
pProcessInfo = ^TProcessInfo;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var p : pProcessInfo;
i : integer;
ContinueLoop:BOOL;
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
l := TList.Create;
l.Clear;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
l.Add(p);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var p : pProcessInfo;
i : integer;
begin
With l do
for i := Count - 1 DownTo 0 do
begin p := items; Dispose(p); Delete(i); end;
end;

...
end.
 
如果你的题目中是判断该外部程序"已经"被用户运行可以用jiangtao的方法
如果你的要求是判断"正在", 那么下面方法可行.
hook并监视WM_CREATE, 判断正在create的window的name即可得知
 
该说的都说了,我mail to you 一个例子去捡点分。
 
如果想知道那个窗口被用户激活(正在使用), 可以用:

function GetForegroundWindow: hwnd;
 
jiangtao:

你的解答不错,但我要求正如Anther_yes说的,要做
监控在一定时间内,用户所运行的外部程序。
另外有关 Process32First 和 CreateToolhelp32Snapshot 两个
函数的帮助在那里可以找到?

Another Yes:

我是个新手,你所说的方法可以给出具体过程吗?
在下先谢了。
Huizhang:

如何知道当前激活的窗口是属于哪个程序的?

Chenk:

我怎么没收到你的例子?
 
发给你,又退回来了。
可到ftp.fortunecity.com,
username:chenkeftp
password:chenkeftp
get pv.zip
enjoy it
 
use SetWindowsHookEx API with iHook param with WH_CALLWNDPROC to
install ur hook procedure.
in ur hook procedure first u judge if the Msg is WM_CREATE message,
if so then trace the message's LParam and judge if the Name in
TCreateStructure is ur focus
 
不用Hook也可以. 你可以在Application.OnIdle中使用FindWindow实现,
最简单的方法.

如果你想监测某个进程是从哪个程序(包括完整路径)运行的, 我有源码.
太长了. 如果需要, 我可以mail给你.
 
如果题目判断的该外部程序已被运行是可以用jiangtao的方法,但如果
是处于任务序列中的程序我用hook也没成功,如有那位大鸟能mail给我
我将无限感激!
 
new很久没有出现了,jiangtao说的不错,Another_eYes说的有道理。
可惜没看见chenke的程序。
 
后退
顶部