两个非常有用的进程函数。


两个非常有用的进程函数。 - yyimen - yyimen的博客
/// <summary>
/// 根据程序名(全路径)获得进程ID(PID)
/// </summary>
/// <param name="APName">程序完整路径+文件名</param>
/// <returns></returns>
function GetPIDByProgramName(const APName: string): THandle;
var
  isFound: boolean;
  AHandle, AhProcess: THandle;
  ProcessEntry32: TProcessEntry32;
  APath: array[0..MAX_PATH] of char;
begin
  try
     Result := 0;
     AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
     isFound := Process32First(AHandle, ProcessEntry32);
     while isFound do
     begin
       AhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
         false, ProcessEntry32.th32ProcessID);
       GetModuleFileNameEx(AhProcess, 0, @APath[0], sizeof(APath));
       if (UpperCase(StrPas(APath)) = UpperCase(APName)) or
         (UpperCase(StrPas(ProcessEntry32.szExeFile)) = UpperCase(APName)) then
       begin
         Result := ProcessEntry32.th32ProcessID;
         break;
       end;
       isFound := Process32Next(AHandle, ProcessEntry32);
       CloseHandle(AhProcess);
     end;
  finally
     CloseHandle(AHandle);
  end;
end;
/// <summary>
/// 获得CPU使用率
/// </summary>
/// <param name="PID">进程PID</param>
/// <returns></returns>
function GetCpuUsage(PID: cardinal): single;
const
  cWaitTime = 200;
var
  h: Cardinal;
  mCreationTime, mExitTime, mKernelTime, mUserTime: _FILETIME;
  TotalTime1, TotalTime2: int64;
begin
  Result := -1;
      {We need to get a handle of the process with PROCESS_QUERY_INFORMATION privileges.}
  h := OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
  try
     {We can use the GetProcessTimes() function to get the amount of time the process has spent in kernel mode and user mode.}
     GetProcessTimes(h, mCreationTime, mExitTime, mKernelTime, mUserTime);
     TotalTime1 := int64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)) + int64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32));
     {Wait a little}
     Sleep(cWaitTime);
     GetProcessTimes(h, mCreationTime, mExitTime, mKernelTime, mUserTime); TotalTime2 := int64(mKernelTime.dwLowDateTime or (mKernelTime.dwHighDateTime shr 32)) +
     int64(mUserTime.dwLowDateTime or (mUserTime.dwHighDateTime shr 32));
     {This should work out nicely, as there were approx. 250 ms between the calls
     and the result will be a percentage between 0 and 100}
     Result := ((TotalTime2 - TotalTime1) / cWaitTime) / 100;
  finally
     CloseHandle(h);
  end;
end;

引用到两个单元
Uses TlHelp32, PsAPI;
这里有一些隐含用途,比如:
1、查询某个程序是否在使用,判断GetPIDByProgramName返回的PID是否大于零。
2、根据CPU使用率大小决定是否终止程序。频频使用这个函数时候,建议最好用一个Thread Timer执行,
      可减低TTimer带来的CPU使用率。

下面是我的一个应用,用到了上面两个函数:



        
        



        







        
          
            
            评论这张
          
        


          
            
               两个非常有用的进程函数。 - yyimen - yyimen的博客
            
            转发至微博
          
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值