`
helloyesyes
  • 浏览: 1294930 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

编程获取系统中各进程的时间信息

阅读更多

需要源代码Email向我所取。

Windows的任务管理器,可以用来查看当前系统中运行的进程信息,这些信息包括进程的名称、IDCPU占用率、占用CPU的时间以及占用内存的情况。有的时候,比如出于安全的考虑,可能希望了解关于某个进程的时间信息,比如进程创建的时间、进程已经运行了多长的时间、进程的内核模式占用时间和进程在用户模式的使用时间等。这时候,进程管理器就显得无能为力了。下面说说利用VC++编程实现获取系统中各进程时间信息的方法。实例完成后的运行效果如下图所示。

关键技术

首先介绍本实例将要用到的几个关键技术。

技术一、GetProcessTimes函数的使用

利用函数GetProcessTimes,能够获取指定进程的四种时间信息,将这些时间信息转换成可读的字符串后进行显示,就可以实现本实例的关键功能。下面的代码片段说明了使用GetProcessTimes的具体方法。

HANDLE hProcess;

FILETIME ftCreateing,

ftExit,

ftKernel,

ftUser;

GetProcessTimes(hProcess,&ftCreateing,&ftExit,&ftKernel,&ftUser);

技术二、计算运行时间

进程的运行时间实际上是一个时间段,即从该进程创建的时间到当前时间的间隔段。计算这个时间段原本比较麻烦,因为它带来了对时间对象进行时、分、秒的转换问题。幸运的是,COleDataTime类为程序设计带来了极大的方便。该类的一个应用代码片段如下:

ColeDataTime timeNow = ColeDataTime::GetCurrentTime();

TimeCreation = ftCreation;

ColeDataTimeSpan timeDiff = timeNow – timeCreation;

这样,开发人员就可以使用COleDataTimeSpan所提供的许多方法来获取时、分、秒等信息。

技术三、计算核心时间和用户时间。

进程在Windows操作系统下运行通常具有两种模式,一种是内核模式(KernelLevel 0),另一种是用户模式(UserLevel 3)。进程往往在这两种模式之间来回切换。实例开发遇到的问题是,获取该时间保存在FILETIME结构中是以千万分之一秒为单位进行计数的。这给程序进行信息的显示带来了困难。解决的方法有两个,分别介绍如下。

方法一、使用一些基本的算术将数据转换为秒单位。比如:

__int64 i64Kernel == *((__int64 *) &ftKernel);

DWORD dwKernel = (DWORD) (i64Kernel / 10000000U);

可以通过定义下面的联合体来方便编程:

union

{

FILETIME ftKernel;

__int64 i64Kernel;

}timeKernel;

timeKernel.ftKernel = ftKernel;

DWORD dwKernel = (DWORD) (timeKernel.i64Kernel / 10000000U );

方法二、使用FileTimeToSystemTime API函数。该函数将转换的结构保存到一个SYSTEMTIME结构中,其成员变量wHourwMinutewSecond即为转换后的数据信息。示例代码片段如下:

SYSTEMTIME stKernel;

FileTimeToSystemTime(&ftKernel , &stKernel);

用户模式时间的转换与上述方法相同。

关键实现代码

下面给出实例实现的关键代码。实例基于对话框创建,使用列表框进行信息的显示,代码中m_lcProcessInfo即为列表框控制对象。

用户列举进程时间信息的函数Process(),具体代码如下。

void CProcessTimeDlg::Process()

{

DWORD dwProcessIDs[150],dwSize,dwNeeded;

HANDLE hProcess;

HMODULE hModuleHandle;

FILETIME ftCreation,ftExit,ftKernel,ftUser;

SYSTEMTIME stKernel,stUser;

CString strName,strData;

int nIndex,nProcessCount,nItem;

COleDateTime timeCreation,timeNow;

COleDateTimeSpan timeDiff;

if (EnumProcesses(dwProcessIDs, sizeof(dwProcessIDs), &dwSize) == TRUE)

{

timeNow = COleDateTime::GetCurrentTime();

nProcessCount = dwSize / sizeof(DWORD);

for (nIndex = 0; nIndex < nProcessCount; nIndex++)

{

hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessIDs[nIndex]);

if (NULL != hProcess)

{

strData.Format("%X", dwProcessIDs[nIndex]);

nItem = m_lcProcessInfo.InsertItem(nIndex, strData);

if (EnumProcessModules(hProcess, &hModuleHandle, sizeof(hModuleHandle), &dwNeeded) == TRUE)

{

if (GetModuleBaseNames(hProcess, hModuleHandle, strName) > 0)

{

m_lcProcessInfo.SetItemText(nItem, 1, strName);

if (GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser) == TRUE)

{

timeCreation = ftCreation;

strData.Format("%02d/%02d/%d - %02d:%02d:%02d",

timeCreation.GetMonth(),

timeCreation.GetDay(),

timeCreation.GetYear(),

timeCreation.GetHour(),

timeCreation.GetMinute(),

timeCreation.GetSecond());

m_lcProcessInfo.SetItemText(nItem, 2, strData);

timeDiff = timeNow - timeCreation;

strData.Format("%ud,%uh,%um,%us", timeDiff.GetDays(), timeDiff.GetHours(), timeDiff.GetMinutes(), timeDiff.GetSeconds());

m_lcProcessInfo.SetItemText(nItem, 3, strData);

FileTimeToSystemTime(&ftKernel, &stKernel);

strData.Format("%uh,%um,%us", stKernel.wHour, stKernel.wMinute, stKernel.wSecond);

m_lcProcessInfo.SetItemText(nItem, 4, strData);

FileTimeToSystemTime(&ftUser, &stUser);

strData.Format("%uh,%um,%us", stUser.wHour, stUser.wMinute, stUser.wSecond);

m_lcProcessInfo.SetItemText(nItem, 5, strData);

}

else

TRACE("GetProcessTimes() failed: %s\n", GetErrorMessage());

}

else

TRACE("GetModuleBaseName() failed: %s\n", GetErrorMessage());

}

else

TRACE2("EnumProcessModules() failed on PID %#x: %s\n", dwProcessIDs[nIndex], GetErrorMessage());

CloseHandle(hProcess);

}

else

TRACE2("OpenProcess(%#x) failed: %s\n", dwProcessIDs[nIndex], GetErrorMessage());

}

}

else

TRACE("EnumProcesses() failed: %s\n", GetErrorMessage());

}

用于返回错误信息的函数GetErrorMessage(),具体实现代码如下。

CString CProcessTimeDlg::GetErrorMessage()

{

CString strError;

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER |

FORMAT_MESSAGE_FROM_SYSTEM |

FORMAT_MESSAGE_IGNORE_INSERTS,

NULL,

GetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

(LPTSTR) &lpMsgBuf,

0,

NULL);

strError = (LPTSTR) lpMsgBuf;

LocalFree(lpMsgBuf);

return (strError);

}

返回指定模块基本名称的函数GetModuleBaseNames(),具体实现代码如下。

DWORD CProcessTimeDlg::GetModuleBaseNames(const HANDLE hProcess, const HMODULE hModule, CString &strName)

{

DWORD dwLength;

dwLength = ::GetModuleBaseName(hProcess, hModule, strName.GetBuffer(MAX_PATH), MAX_PATH);

strName.ReleaseBuffer();

return (dwLength);

}

以上就是实例的关键实现代码,使用时直接调用Process函数即可。注意先在自己的项目中包含psapi.h头文件。

分享到:
评论

相关推荐

    C#中获取系统当前所有进程

    在C#编程环境中,我们可以利用.NET Framework提供的System.Diagnostics命名空间中的Process类来获取并管理操作系统中的进程信息。本文将深入探讨如何使用C#获取系统当前的所有进程,以及这些信息的详细含义。 首先...

    获取系统进程详细信息

    总结来说,通过编程获取系统进程详细信息是一项实用的技能,能够帮助我们深入理解系统的运行状态。使用VS08和C++,结合Windows API,可以实现进程的查询、创建和结束,为系统管理和故障排查提供有力的支持。同时,这...

    C#获取系统进程信息

    在实际开发中,获取系统进程信息可能用于性能监控、故障排查或者资源管理等场景。了解如何使用C#操作进程是提升开发者解决问题能力的重要一环。希望这个例子能帮助初学者更好地理解C#中处理系统进程的方法,并在实际...

    获取本机机器的进程信息

    - **列举所有进程**:可以使用`Process.GetProcesses()`方法获取系统中所有运行的进程列表。 - **通过进程名获取进程**:`Process.GetProcessesByName("进程名")`可以获取指定名称的进程。 - **通过PID获取进程**...

    QT 获取 进程名、PID、CPU时间、内存、用户对象、GDI对象,获取盘符的容量和监控硬盘的插拔

    要获取系统中所有进程的信息,需要借助操作系统API,如Windows的`EnumProcesses`函数,Linux的`ps`命令或`/proc`文件系统。 2. **获取CPU时间**: 在Linux系统中,可以通过读取`/proc/&lt;pid&gt;/stat`文件获取进程的...

    c#获取系统和指定进程的CPU和内存占用率

    在C#编程中,了解如何获取系统和特定进程的CPU及内存占用率是十分重要的,尤其是在进行性能监控或资源管理的场景下。本篇将详细解释如何实现这一功能,并提供相应的代码示例。 首先,我们要关注的是操作系统级别的...

    如何获取系统进程信息

    C#是微软开发的一种面向对象的编程语言,它提供了丰富的类库和API,使得获取系统进程信息变得相对简单。 首先,我们要引入.NET框架中的System.Diagnostics命名空间,这个命名空间包含了处理进程和系统诊断所需的...

    易语言取进程时间

    获取进程信息涉及到对操作系统进程的管理,这需要使用`OpenProcess`函数来获取一个进程的句柄。此函数需要进程ID作为参数,返回一个表示进程的句柄,后续可以通过这个句柄进行各种操作,如读取进程信息。 三、获取...

    获取系统目前的程序进程

    在编程中,我们还可以通过各种编程语言提供的API来获取进程信息。例如: - Python:使用`psutil`库,`psutil.process_iter(['name'])`可以获取指定名字的进程。 - Java:使用`java.lang.management....

    C# 获取进程的信息

    在C#编程中,获取进程的信息是常见的任务,这涉及到操作系统级别的交互,允许开发者监控、控制或通信与其他正在运行的进程。以下是一些关键知识点,详细介绍了如何在C#中获取进程信息: 1. **Process类**: .NET ...

    如何实时获取系统每个进程占用的CPU?--讨论及请教

    ### 实时获取系统进程CPU占用率的方法 在深入探讨之前,我们先理解几个基础概念: - **进程**:计算机系统中的一个运行实体,包括程序执行的代码、当前状态、内存使用情况等。 - **CPU占用率**:指一段时间内CPU...

    获取系统进程信息.zip易语言项目例子源码下载

    在IT行业中,获取系统进程信息是一项基础且重要的任务,它涉及到操作系统管理的程序执行状态、资源占用情况等关键数据。易语言是一种普及度较高的中文编程语言,尤其适合初学者和小型团队进行项目开发。本项目提供了...

    获取系统进程系统

    在Linux环境下,可以利用命令行工具来获取系统进程信息。`ps`命令是最基础的进程查看命令,它可以显示当前终端下的进程状态。`top`命令则提供了一个实时的动态视图,展示各个进程的资源消耗情况。更高级的工具如`...

    Python获取系统所有进程PID及进程名称的方法示例

    在Python编程语言中,获取系统进程信息并对其进行分析和操作是一种常见的需求。Python提供了一个强大的第三方库psutil,该库专门用于检索系统运行时信息,包括进程信息、系统利用率、硬件利用率等。本文将详细解析...

    系统进程管理 获取进程 结束进程

    在IT领域,系统进程管理是操作系统的核心组成部分,它涉及到如何创建、调度、监控以及结束进程。本文将深入探讨“获取进程”与“结束进程”的基本原理,并介绍几个关键的API函数,这些都是软件开发者在实现类似任务...

    易语言获取系统进程线程信息源码

    在本压缩包中,提供的源码是关于“获取系统进程线程信息”的,这对于系统监控、性能分析以及问题排查等场景非常有用。 首先,我们要理解什么是进程和线程。在操作系统中,进程是程序的一次执行实例,它是资源分配的...

    delphi写的获取系统进程

    总之,使用Delphi获取系统进程信息涉及了对Windows API的深入理解和应用,这不仅需要熟悉Delphi的类库,还需要熟悉底层的操作系统机制。通过合理地组合和使用这些工具,开发者可以构建出强大而灵活的系统监控工具,...

    易语言取进程创建时间源码

    在IT领域,尤其是在编程实践中,有时我们需要获取进程的创建时间以进行各种系统分析或调试工作。易语言,作为一款中国本土开发的、面向初学者的编程语言,提供了丰富的功能来处理此类任务。在这个场景中,"易语言取...

    获取进程的cpu和内存的占用大小

    为了计算CPU占用率,我们使用`GetProcessTimes`获取进程的创建时间、退出时间、内核时间和用户时间,然后根据这些信息计算出CPU使用时间占总时间的比例,转化为百分比。 需要注意的是,由于CPU占用率是瞬时值,为了...

    C# 任务管理器及控制台获取CPU占用率前3位进程

    在C#中,我们可以利用.NET Framework提供的System.Diagnostics命名空间中的Process和ProcessManager类来获取系统进程信息。Process类代表一个正在运行的进程,而ProcessManager类则提供了访问系统进程的全局方法。...

Global site tag (gtag.js) - Google Analytics