如何用Win32 APIs枚举应用程序窗口和进程

摘要

我们在编写程序时,常常遇到的一件事情就是要准确列出系统中所有正在运行的程序或者进程。Windows 任务管理器就是这样的一个程序。它既能列出运行的桌面应用程序,又能列出系统中所有运行的进程。那么,我们在程序中如何实现这样的任务呢?本文下面将详细讨论这个问题。

枚举顶层(top-level)窗口

枚举桌面顶层窗口相对于枚举进程来说可能要容易一些。枚举桌面顶层窗口的方法是用 EnumWindows() 函数。不要用 GetWindow()来创建窗口列表,因为窗口之间复杂的父子及同胞关系(Z-Order)容易造成混乱而使得枚举结果不准确。

EnumWindows()有两个参数,一个是指向回调函数的指针,一个是用户定义的 LPARAM 值, 针对每个桌面窗口(或者顶层窗口)它调用回调函数一次。然后回调函数用该窗口句柄做一些处理,比如将它添加到列表中。这个方法保证枚举结果不会被窗口复杂的层次关系搞乱,因此,一旦有了窗口句柄,我们就可以通过 GetWindowText() 得到窗口标题。

枚举进程

建立系统进程列表比枚举窗口稍微复杂一些。这主要是因为所用的 API 函数对于不同的 Win32 操作系统有依赖性。在 Windows 9x、Windows Me、Windows 2000 Professional 以及 Windows XP 中,我们可以用 ToolHelp32 库中的 APIs 函数。但是在 Windows NT 里,我们必须用 PSAPI 库中的 APIs 函数, PSAPI 库是 SDK 的一部分。本文我们将讨论上述所有平台中的实现。附带的例子程序将对上述库中的 APIs 进行包装,以便包装后的函数能支持所有 Win32 操作系统。

使用 ToolHelp32 库枚举进程

ToolHelp32 库函数在 KERNEL32.dll 中,它们都是标准的 API 函数。但是 Windows NT 4.0 不提供这些函。

ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。

使用 ToolHelp32 函数的第一步是用 CreateToolhelp32Snapshot() 函数创建系统信息“快照”。这个函数可以让你选择存储在快照中的信息类型。如果你只是对进程信息感兴趣,那么只要包含 TH32CS_SNAPPROCESS 标志即可。 CreateToolhelp32Snapshot() 函数返回一个 HANDLE,完成调用之后,必须将此 HANDLE 传给 CloseHandle()。

接下来是调用一次 Process32First 函数,从快照中获取进程列表,然后重复调用 Process32Next,直到函数返回 FALSE 为止。这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个  PROCESSENTRY32 结构。

调用完 Process32First 或 Process32Next 之后,PROCESSENTRY32 中将包含系统中某个进程的关键信息。其中进程 ID 就存储在此结构的 th32ProcessID。此 ID 可以被传给 OpenProcess() API 以获得该进程的句柄。对应的可执行文件名及其存放路径存放在 szExeFile 结构成员中。在该结构中还可以找到其它一些有用的信息。

注意:在调用 Process32First() 之前,一定要记住将 PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)。

时间: 2024-08-03 05:43:48

如何用Win32 APIs枚举应用程序窗口和进程的相关文章

210 wince 用户按键-TQ210如何用用户按键控制应用程序窗口

问题描述 TQ210如何用用户按键控制应用程序窗口 各位好,我买了TQ210的板子,wince的系统,想做个用已有用户按键控制应用程序窗口切换的功能,现在enter键和退出键板子上就可以用,但是上下左右键要怎么修改?是修改驱动还是在应用程序里加上代码就可以?新人不知道从哪入手,请帮忙看看,谢谢!

C#实现关闭其他程序窗口或进程代码分享

  这篇文章主要介绍了C#实现关闭其他程序窗口或进程代码分享,本文给出了两种方法,并分别给出示例代码,需要的朋友可以参考下 在进行winform开发过程中有时候会需要关闭其他程序或者关闭进程,以前写过一篇相关介绍的文章,今天有同事问起来,于是在次翻出来和大家分享一下. 下面介绍我所知的两种方法,应该对大家有帮助,如果有朋友知道其他的方法,谢谢共享一下. 方法1 ProcName 需要关闭的进程名称 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

如何“干净地”终止Win32中的应用程序

摘要 在理想环境中,某一进程可能会通过某种形式的进程间通信要求另一进程关闭.不过,如果你对希望其关闭的应用程序没有源代码级控制权,可能就没有办法做这样的选择.尽管没有哪种方法能保证"干净地"关闭 Win32 中的应用程序,但你可以采取一些步骤来确保应用程序使用最佳方法清除资源. 32 位进程(和 Windows 95 下的 16 位进程) 在 Win32 下,操作系统可保证在进程关闭时清除进程所拥有的资源.但是,这并不意味着进程本身将有机会对磁盘执行任何最后的信息刷新或通过远程连接执行

c语言 c++-【如何用C语言或C++做窗口程序】

问题描述 [如何用C语言或C++做窗口程序] 不知道问这个问题会不会让大神笑话,但是小白还是希望大神能够提供帮助,大家都是从小白过来的,希望见谅! 解决方案 MFC呀,,,如果你喜欢的话,引入window头文件也可以

控制台窗口-小弟请教关于程序窗口的问题

问题描述 小弟请教关于程序窗口的问题 请教大神控制台窗口和windows窗口什么不同,为什么不同的IDE会使用不同的窗口,像codeblocks使用windows的,VS2013使用控制台的,希望大神详细回答 解决方案 你找个控制台程序和窗口程序 ,运行一下,操作一下,就能感觉到了 解决方案二: VS2013使用控制台的窗口? vs 也可以做windows的.exe 程序啊 解决方案三: VS2013的功能很强大的,也可以做windows应用程序,建议你去看一下WFC.Winform开发...

在VC中隐藏控制台程序窗口的实现代码_C 语言

下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的 /subsystem 选项该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver|efi_rom|efi_runtime_driver|native|posix|window

Win7屏蔽IE浏览器弹出的阻止程序窗口和IE隐私权限

我们在用Windows 7系统访问网站时,IE8窗口总是弹出阻止程序,其实这是IE浏览器的一项防护功能,可以屏蔽大量的弹出式窗口.当然,屏蔽的级别可以根据个人的需要来设置. Windows 7系统下屏蔽IE浏览器弹出的阻止程序窗口和IE隐私权限的设置方法与步骤如下: 1.打开win菜单,在"开始菜单"中选择"控制面板"选项. 2.如果是按"网络和Internet"里选择"Internet "选项. 3.选择"Inte

怎么让Windows 7程序窗口更听话

  鼠标悬停,窗口随即激活 在日常的电脑应用中,我们经常会碰到这样一些情况:在系统桌面上打开多个程序窗口,需要在这些窗口之间反复切换,要激活某个程序窗口的话,通常还得在某个窗口上点击一下才能激活,要是能够将鼠标放到窗口上就激活的话那不是更好?在Windows XP系统中要实现还很麻烦,需要借助于Tweak UI之类的辅助工具来实现,而在Windows 7中只需简单设置即可. 点击"开始"按钮后选择"控制面板"打开控制面板,点击"轻松访问"后在&q

Windows7系统下如何快速激活程序窗口

  1.打开"控制面板",在控制面板中点击"轻松访问". 2.在"轻松访问中心"下选择"更改鼠标的工作方式",在打开的"使鼠标更易于使用"窗口里,勾选上"通过鼠标悬停在窗口上来激活窗口",应用确定后,退出就搞定了. 很多时候用户在使用windows7系统的时候都会遇到需要同时打开多个程序窗口的操作,为了让操作更方便,更加快速地激活目标程序窗口,用户可以通过设置鼠标的操作习惯来设置,方法很