如何取得正在系统中运行的程序的名称及路径的列表?

WindowsAPI 2002-01-22 01:01:23
急待解决,谢谢!!
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wz2001 2002-01-22
  • 打赏
  • 举报
回复
把kylion的例程删一大半不就可以了吗
WindowsAPI 2002-01-22
  • 打赏
  • 举报
回复
我说的是出现在WINDOWS操作系统“关闭程序”对话框中的那些程序的名称和路径。
kylion 2002-01-22
  • 打赏
  • 举报
回复
procedure ScanProcess;
var
Process:^TProcessinfo;
NotProcessEnd:boolean;
ProcessListHandle:THandle;
ProcessStructure:TProcessEntry32;
FP:pointer;
Pi:integer;
TmpExeFile:string;
TmpID:DWORD;
TmpProcess:^TProcessinfo;
ProcessFound:boolean;
ProcessHandle:THandle;
FCreateTime:FILETIME;
SCreateTime:SYSTEMTIME;
FExitTime:FILETIME;
// SExitTime:SYSTEMTIME;
KernelTime:FILETIME;
UserTime:FILETIME;
// KTime:integer;
// UTime:integer;
// ExitCode:DWORD;
begin
//清除CurrentList
CurrentList.Clear;
//清除NewList
NewList.Clear;
//创建Snapshot,为下一步的进程搜索作准备
ProcessListHandle:=Createtoolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//初始化Snapshot Handle
ProcessStructure.dwSize:=sizeof(ProcessStructure);
//取第一个进程信息
NotProcessEnd:=process32First(ProcessListHandle,ProcessStructure);
//循环取下一个进程
while NotProcessEnd do
begin
TmpExeFile:=ProcessStructure.szExeFile;
TmpID:=ProcessStructure.th32ProcessID;
//初始化进程搜索标志
ProcessFound:=false;
//在已存在的进程列表中搜索进程
for Pi:=0 to ProcessList.Count-1 do
begin
TmpProcess:=ProcessList.Items[Pi];
if (TmpExeFile=TmpProcess.ExeFile)and(TmpID=TmpProcess.ProcessID) then
begin//进程已存在
//修改进程检测时间
TmpProcess.EndTime:=Time;
//添加到当前进程列表中
CurrentList.Add(TmpProcess);
//更改进程搜索标志
ProcessFound:=true;
//退出已知进程搜索循环
break;
end;
end;
//如果进程已存在,则跳过新建节点代码
if ProcessFound then
begin
//得到下一个进程
NotProcessEnd:=Process32Next(ProcessListHandle,ProcessStructure);
continue;
end;
//创建新进程接点
New(Process);
//取进程相关信息
Process.ExeFile:=ProcessStructure.szExeFile;
Process.ProcessID:=ProcessStructure.th32ProcessID;
Process.BasePrior:=ProcessStructure.pcPriClassBase;
Process.ParentID:=ProcessStructure.th32ParentProcessID;
Process.ThreadNum:=ProcessStructure.cntThreads;
Process.FirstWindows:=0;
//Process.BeginTime:=Time;
//Process.EndTime:=Time;
//通过进程ID得到进程句柄
ProcessHandle:=OpenProcess(PROCESS_QUERY_INFORMATION,true,Process.ProcessID);

//取进程相关时间
GetProcessTimes(ProcessHandle,FCreateTime,FExitTime,KernelTime,UserTime);
{if GetExitCodeProcess(ProcessHandle,ExitCode) then
Process.ParentID:=ExitCode
else Process.ParentID:=0;}
closeHandle(ProcessHandle);
//转换进程创建时间
FileTimeToLocalFileTime(FCreateTime,FCreateTIme);
FileTimeToSystemTime(FCreateTime,SCreateTime);
//FileTimetoSystemTime(FExitTime,SExitTIme);
//FileTimeToSystemTime(KernelTime,SKTime);
//FileTimetoSystemTime(UserTime,SUTime);
GetProcessBase(Process^,KernelTime, UserTime);
{
try
if (SystemTimeToDateTime(SKTime)>SystemTimeToDateTime(SUTime)) then
Process.ProcessBase:='系统进程';
except
Process.ProcessBase:='系统进程';
end;}
// showmessage(Process.ExeFile);
// Process.ProcessBase:='系统进程';
try
Process.BeginTime:=SystemTimeToDateTime(SCreateTime);
except
Process.BeginTime:=Date;
end;
Process.EndTime:=Date+Time;
{
//转换当前时区
//SystemTimeToTzSpecificLocalTime(@TimeZone,Process.createTime,SCreateTime);
//得到时间字符串
//GetTimeFormat(LOCALE_USER_DEFAULT,TIME_FORCE24HOURFORMAT,@SCreateTime,CTimeStr,'HH'':''mm'':''ss',11);
//转换进程撤消时间
//FileTimetoSystemTime(ExitTime,process.TerminateTime);
}
//添加新进程
ProcessList.Add(Process);
//添加到新进程列表
NewList.Add(Process);
//添加到当前进程列表
CurrentList.Add(Process);
//得到下一个进程
NotProcessEnd:=Process32Next(ProcessListHandle,ProcessStructure);
end;
ClearWindowText;
CallbackFunction(FP):=EnumWindowsProc;
//初始化回调函数
ThreadListNum:=0;
{//检索窗口
EnumWindows(FP,0);
CloseHandle(ProcessListHandle);//别忘了释放Snapshot Handle
end;
zjj_horse 2002-01-22
  • 打赏
  • 举报
回复
ExtractFilePath(paramstr(0))+filename
cszhz 2002-01-22
  • 打赏
  • 举报
回复
openprocess
.......
40Star 2002-01-22
  • 打赏
  • 举报
回复
所有的吗?还是自己的?
自己的用ExtractFilePath()/ExtractFileDir()都行!

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧