关键技术
首先介绍本实例将要用到的几个关键技术。
技术一、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操作系统下运行通常具有两种模式,一种是内核模式(Kernel:Level 0),另一种是用户模式(User:Level 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结构中,其成员变量wHour,wMinute和wSecond即为转换后的数据信息。示例代码片段如下:
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头文件。
相关推荐
总结来说,通过编程获取系统进程详细信息是一项实用的技能,能够帮助我们深入理解系统的运行状态。使用VS08和C++,结合Windows API,可以实现进程的查询、创建和结束,为系统管理和故障排查提供有力的支持。同时,这...
在实际开发中,获取系统进程信息可能用于性能监控、故障排查或者资源管理等场景。了解如何使用C#操作进程是提升开发者解决问题能力的重要一环。希望这个例子能帮助初学者更好地理解C#中处理系统进程的方法,并在实际...
- **列举所有进程**:可以使用`Process.GetProcesses()`方法获取系统中所有运行的进程列表。 - **通过进程名获取进程**:`Process.GetProcessesByName("进程名")`可以获取指定名称的进程。 - **通过PID获取进程**...
要获取系统中所有进程的信息,需要借助操作系统API,如Windows的`EnumProcesses`函数,Linux的`ps`命令或`/proc`文件系统。 2. **获取CPU时间**: 在Linux系统中,可以通过读取`/proc/<pid>/stat`文件获取进程的...
在C#编程中,了解如何获取系统和特定进程的CPU及内存占用率是十分重要的,尤其是在进行性能监控或资源管理的场景下。本篇将详细解释如何实现这一功能,并提供相应的代码示例。 首先,我们要关注的是操作系统级别的...
C#是微软开发的一种面向对象的编程语言,它提供了丰富的类库和API,使得获取系统进程信息变得相对简单。 首先,我们要引入.NET框架中的System.Diagnostics命名空间,这个命名空间包含了处理进程和系统诊断所需的...
在C#编程环境中,我们可以利用.NET Framework提供的System.Diagnostics命名空间中的Process类来获取并管理操作系统中的进程信息。本文将深入探讨如何使用C#获取系统当前的所有进程,以及这些信息的详细含义。 首先...
在编程中,我们还可以通过各种编程语言提供的API来获取进程信息。例如: - Python:使用`psutil`库,`psutil.process_iter(['name'])`可以获取指定名字的进程。 - Java:使用`java.lang.management....
在C#编程中,获取进程的信息是常见的任务,这涉及到操作系统级别的交互,允许开发者监控、控制或通信与其他正在运行的进程。以下是一些关键知识点,详细介绍了如何在C#中获取进程信息: 1. **Process类**: .NET ...
获取进程信息涉及到对操作系统进程的管理,这需要使用`OpenProcess`函数来获取一个进程的句柄。此函数需要进程ID作为参数,返回一个表示进程的句柄,后续可以通过这个句柄进行各种操作,如读取进程信息。 三、获取...
### 实时获取系统进程CPU占用率的方法 在深入探讨之前,我们先理解几个基础概念: - **进程**:计算机系统中的一个运行实体,包括程序执行的代码、当前状态、内存使用情况等。 - **CPU占用率**:指一段时间内CPU...
在IT行业中,获取系统进程信息是一项基础且重要的任务,它涉及到操作系统管理的程序执行状态、资源占用情况等关键数据。易语言是一种普及度较高的中文编程语言,尤其适合初学者和小型团队进行项目开发。本项目提供了...
在Linux环境下,可以利用命令行工具来获取系统进程信息。`ps`命令是最基础的进程查看命令,它可以显示当前终端下的进程状态。`top`命令则提供了一个实时的动态视图,展示各个进程的资源消耗情况。更高级的工具如`...
在Python编程语言中,获取系统进程信息并对其进行分析和操作是一种常见的需求。Python提供了一个强大的第三方库psutil,该库专门用于检索系统运行时信息,包括进程信息、系统利用率、硬件利用率等。本文将详细解析...
在IT领域,系统进程管理是操作系统的核心组成部分,它涉及到如何创建、调度、监控以及结束进程。本文将深入探讨“获取进程”与“结束进程”的基本原理,并介绍几个关键的API函数,这些都是软件开发者在实现类似任务...
在本压缩包中,提供的源码是关于“获取系统进程线程信息”的,这对于系统监控、性能分析以及问题排查等场景非常有用。 首先,我们要理解什么是进程和线程。在操作系统中,进程是程序的一次执行实例,它是资源分配的...
总之,使用Delphi获取系统进程信息涉及了对Windows API的深入理解和应用,这不仅需要熟悉Delphi的类库,还需要熟悉底层的操作系统机制。通过合理地组合和使用这些工具,开发者可以构建出强大而灵活的系统监控工具,...
在C#中,我们可以利用.NET Framework提供的System.Diagnostics命名空间中的Process和ProcessManager类来获取系统进程信息。Process类代表一个正在运行的进程,而ProcessManager类则提供了访问系统进程的全局方法。...
在IT领域,尤其是在编程实践中,有时我们需要获取进程的创建时间以进行各种系统分析或调试工作。易语言,作为一款中国本土开发的、面向初学者的编程语言,提供了丰富的功能来处理此类任务。在这个场景中,"易语言取...
在.NET框架中,WinForm应用程序可以用来创建交互式的桌面应用,其中一个常见的需求是获取系统进程信息。本教程将深入探讨如何使用C#编程语言,在WinForm应用中实现这一功能。 首先,我们需要导入必要的命名空间,这...