下面是具体代码
总共分为两个过程
EnumProcTree 主要用来枚举句柄树
KillProc 关闭某个程序的进程
procedure EnumProcTree(const PID: DWORD;
out PID_Tree: TPIDTree);
procedure ListTree(RootPID: DWORD);
var
hP_Root: THandle;
Found: Boolean;
Pn: TProcesseNtry32;
hSnap: THandle;
begin
hP_Root := OpenProcess(PROCESS_ALL_ACCESS, False, RootPID);
if hP_Root <> 0 then
begin
CloseHandle(hP_Root);
SetLength(PID_Tree, Length(PID_Tree) + 1);
PID_Tree[Length(PID_Tree) - 1] := RootPID;
hSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
Pn.dwSize := SizeOf(TProcesseNtry32);
Found := Process32First(hSnap, Pn);
while Found do
begin
if RootPID = Pn.th32ParentProcessID then
begin
ListTree(Pn.th32ProcessID);
end;
Found := Process32Next(hSnap, Pn);
end;
CloseHandle(hSnap);
end;
end;
begin
SetLength(PID_Tree, 0);
ListTree(PID);
end;
KillProc过程的参数:
PID需要结束的句柄ID
Killchild是否结束子进程
如果KillChild是True,那么首先枚举所有的子句柄,然后一次性都关闭
procedure KillProc(PID: DWORD; Killchild: Boolean = True; const ExitCode: Cardinal = 0);
var
i: integer;
hProc: THandle;
PID_Tree: TPIDTree;
begin
if Killchild then
begin
EnumProcTree(PID, PID_Tree);
for i := High(PID_Tree) downto Low(PID_Tree) do
begin
if (PID_Tree[i] <> 0) then
begin
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, PID_Tree[i]);
if hProc <> 0 then
begin
TerminateProcess(hProc, ExitCode);
CloseHandle(hProc);
end;
end;
end;
end
else
begin
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if hProc <> 0 then
begin
TerminateProcess(hProc, ExitCode);
CloseHandle(hProc);
end;
end;
end;
使用代码
KillProc(lpProcessInformation.dwProcessId, True, Result);
lpProcessInformation.dwProcessId 进程的句柄ID
True结束子进程
本文地址:
http://www.xszlo.com/article/2012-12-24/7746.html,转发请保留这个地址,谢谢
分享到:
相关推荐
而“进程句柄”则是一种用于操作系统内部管理的标识符,通过句柄,程序可以对进程进行操作,如读写、控制等。 "GetWindowThreadProcessId"是Windows API中一个重要的函数,它的作用是从窗口的句柄中获取与该窗口...
' 关闭进程句柄 CloseHandle hProcess Else MsgBox "创建进程失败" End If ``` 以上代码展示了如何在VB中启动一个进程并监听其退出。`GetExitCodeProcess`函数用于获取进程的退出代码,这个代码通常反映了进程的...
在编程实践中,了解和使用进程句柄可以提高程序的效率和安全性。比如,当我们需要关闭一个文件或结束一个进程时,直接使用句柄会比通过其他间接方法更有效率,因为操作系统内部查找和验证句柄的过程更快。此外,句柄...
在某些情况下,我们可能需要强制结束某个无响应或者占用过多资源的进程,这就是“关闭进程”的作用。简易任务管理器允许用户选择并终止特定的进程,从而释放系统资源,确保系统的正常运行。 然后,我们讨论“句柄”...
窗口则是用户界面中的可视元素,通常与某个进程关联。在MFC中,我们可以使用Windows API函数来操作这些进程和窗口。 1. **查找进程**: 要找到并关闭特定进程,我们需要知道进程的名称。可以使用`EnumProcesses`...
"关闭进程打开的句柄"这一主题主要关注如何获取并关闭其他程序创建的句柄,以实现更精细的系统管理。 首先,我们需要理解什么是进程。进程是执行中的程序实例,每个进程都有自己的内存空间和系统资源。句柄则提供了...
假设我们需要编写一个程序,该程序创建一个子进程并在其中运行一个线程来完成某个任务。首先,我们使用`CreateProcess`函数来创建一个新进程,并传递给子进程一个句柄,该句柄指向一个共享资源(如文件)。接着,在...
在编程领域,尤其是在Windows操作系统上开发应用程序时,有时我们需要对系统中的进程进行管理,比如强制结束某个进程或者关闭特定的程序窗口。本文将详细讲解如何使用C#语言来实现这一功能,结合“强制结束进程”和...
1. **获取进程信息**:要关闭某个外部程序,我们首先要找到它的进程ID。这可以通过`EnumProcesses` API函数实现,它能列出系统中所有运行的进程ID。你需要提供一个缓冲区来存储这些ID,并调用`EnumProcesses`来填充...
接着,我们调用`EndProcess`来结束进程,并确保最后关闭进程句柄。 需要注意的是,关闭进程需要相应的权限,如果没有足够的权限(例如,尝试关闭系统进程),则会导致操作失败。此外,直接结束进程可能会影响到其他...
一旦获得了进程句柄,可以使用`TerminateProcess`函数来结束指定的进程。需要注意的是,这个操作是立即的且不可逆,因此在执行前应谨慎。 3. **处理多用户情况**: 描述中提到,这个例子没有处理多用户同时登录的...
创建互斥体后,线程可以通过调用`CreateMutex()`函数获取一个互斥句柄。这个句柄用于后续的`WaitForSingleObject()`或`WaitForMultipleObjects()`等函数,这些函数会让调用线程进入等待状态,直到互斥体被释放。当一...
在VB(Visual Basic)编程中,查看进程是否运行是一项常见的任务,这有助于程序根据系统当前的运行状态执行相应的操作。本篇文章将详细讲解如何利用VB实现这一功能,并提供相关代码示例。 首先,我们需要理解什么是...
例如,`OpenProcess`用于获取进程句柄,`GetModuleHandle`用于获取模块句柄,`CloseHandle`用于关闭已打开的句柄。在VB中,调用API需要使用 Declare 语句声明函数原型,并传递适当的参数。 四、风险与安全 虽然进程...
本资源主要关注的是如何利用易语言中的互斥体(Mutex)机制来防止程序重复运行,这是一个常见的多进程同步问题。互斥体在多线程和多进程编程中扮演着关键角色,确保同一时间只有一个实例可以访问共享资源,从而避免...
最后,完成操作后记得释放资源,关闭进程句柄: ```易语言 API "kernel32.dll", "CloseHandle", .取整数, 进程句柄 ``` 这个过程涉及到的知识点包括易语言的基础语法、API函数的调用、Windows API的理解和应用、...
禁止运行某程序的主要思路是通过系统API(应用程序接口)来实现。在易语言中,我们可以调用Windows API函数来达到这一目的。Windows API提供了丰富的功能,其中`CreateToolhelp32Snapshot`和`Process32First/Next`...
2. **跟踪句柄变化**:记录句柄的创建、关闭和状态改变,以便分析其在整个程序执行过程中的行为。 3. **检测资源争用**:找出可能导致阻塞或延迟的事件对象句柄,分析其背后的原因。 4. **调试问题**:当出现错误或...
杀进程模块是系统管理中常见的功能,主要用于结束运行中的某个程序。在Windows操作系统中,进程是执行中的应用程序实例,每个进程都有一个独立的内存空间。杀进程通常涉及到以下几个步骤: 1. **获取进程信息**:...
在某些情况下,比如需要强制关闭某个不响应的程序或执行清理操作时,这一功能尤其重要。需要注意的是,结束进程应当谨慎操作,因为它可能会影响到其他依赖于该进程的程序。 在实际开发中,易语言系统进程管理模块...