主页 > 软件知识 >

如何获取当前正在运行的应用程序列表?匆忙。 . . .

进程管理是Windows中比较重要的内容。由于每个正在运行的程序(包括Windows后台程序和动态链接库)都有自己的进程,通过进程管理可以防止一些非法程序。 (比如木马程序),但是Windows任务管理器(按ALT+CTRL+DEL后出现的东西)可以中止进程,但是一些与系统相关的进程已经被阻止在它的进程列表中。现在它有木马(如Glacier)在编程时将自己注册为系统服务,因此无法通过Windows任务管理器停止其进程;而Windows系统信息工具msinfo32.exe可以列出系统中的所有系统。进程,但不能停止进程,所以无济于事。

为此获取程序aboutcaption 软件,我们可以自己编写一个流程管理软件。首先,它必须能够列出系统中的所有进程,其次,它必须能够终止系统中的任何进程(当然,有些进程终止后可能会崩溃)。

编程思路:列出系统进程的一般方法是调用一组ToolHelp32函数,这些函数存在于kernel32.dll链接库中。它有很多功能,但是枚举系统中的进程。功能之一。以下是关于要使用的进程的几个 API 函数:CreateToolHelpSnapshot()、ProcessFirst()、ProcessNext()。不知道为什么,微软没有在VB API文本浏览器中输入这么重要的功能,所以我们不得不手动输入。声明如下:

PublicDeclareFunctionCreateToolhelpSnapshotLib"kernel32"Alias"CreateToolhelp32Snapshot"(ByVallFlagsAsLong,ByVallProcessIDAsLong)AsLong

PublicDeclareFunctionProcessFirstLib"kernel32"Alias"Process32First"(ByValhSnapShotAsLong,uProcessAsPROCESSENTRY32)AsLong

PublicDeclareFunctionProcessNextLib"kernel32"Alias"Process32Next"(ByValhSnapShotAsLong,uProcessAsPROCESSENTRY32)AsLong

另外,需要定义一个PROCESSENTRY32结构体。这个结构体包含了系统中进程的一些信息,在VB中的API文本浏览器中也没有输入。

PublicTypePROCESSENTRY32

dwSizeAsLong

cntUsageAsLong

th32ProcessIDAsLong

(第三十三版续)th32DefaultHeapIDAsLong

如何获取当前正在运行的应用程序列表?匆忙。 . . .

关闭进程也是一个值得讨论的问题。传统的方法是使用GetWindow查找窗口句柄,然后使用GetWindowText获取窗口标题,然后使用SendMessage函数发送WM_CLOSE消息关闭程序。但是这种方法有很大的缺陷:一是有些窗口没有标题栏,这样的程序不能用这种方法关闭;其次获取程序aboutcaption 软件,动态链接库不能关闭此方法。这里可以充分利用PROCESSENTRY32结构体,它有一个th32ProcessID成员,可以通过TerminateProcess()函数关闭进程。

以下是编程的具体步骤:

1.新建项目,在Form1表单中添加一个ListView控件和两个CommandButton;

2. 设置控件如下: Command1.Caption="查看进程"; Command2.Caption="停止进程"; lvw.width=5400

3.在“项目”中选择“添加模块”,添加上面的函数和结构声明以及如下内容:

PublicDeclareFunctionTerminateProcessLib"kernel32"(ByValhProcessAsLong,ByValuExitCodeAsLong)AsLong

PublicDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong

PublicDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong

PublicConstTH32CS_SNAPPROCESS=&H2

PublicConstTH32CS_SNAPheaplist=&H1

PublicConstTH32CS_SNAPthread=&H4

PublicConstTH32CS_SNAPmodule=&H8PublicConstTH32CS_SNAPall=TH32CS_SNAPPROCESS+TH32CS_SNAPheaplist+TH32CS_SNAPthread+TH32CS_SNAPmodule

如何获取当前正在运行的应用程序列表?匆忙。 . . .

Whiletheloop0'返回值非零时继续获取下一个进程

exename=proc.szExeFile

ret=lvw.ListItems.Add(,"first"&CStr(i),exename)'将进程名添加到第一项

lvw.ListItems("first"&CStr(i)).SubItems(1)=proc.th32ProcessID'将进程ID添加到第二项

i=i+1

theloop=ProcessNext(snap,proc)

温德

CloseHandlesnap'关闭进程“快照”句柄

结束订阅

PrivateSubCommand2_Click()

DimiAsLong

hand=OpenProcess(process_terminate,True,CLng(lvw.SelectedItem.SubItems(1)))'获取进程句柄

TerminateProcesshand,0'关闭进程

Callcommand1_Click'调用查看进程刷新进程列表

结束订阅

PrivateSubForm_Load()

DimheaderAsColumnHeader

lvw.View=lvwReport

lvw.ColumnHeaders.Clear

Setheader=lvw.ColumnHeaders.Add(,"first","process",4000)'设置ListView中item的宽度,读者也可以自己设置

Setheader=lvw.ColumnHeaders.Add(,"second","ID",1400)

lvw.Refresh

结束订阅

程序运行在Windows98中文版和VB6.0中文企业版下。需要注意的是,由于Windows 95/98和WinNT的系统进程中列出的Windows API函数不同,上述程序只能在Win95/98下运行,不能在WinNT和Win2000下运行。