Vb6 在Vb中如何向其他正在运行的进程发送终止消息?

Vb6 在Vb中如何向其他正在运行的进程发送终止消息?,vb6,Vb6,我想向其他正在运行的进程发送关闭消息 为此,我有这个过程的名称 非进程ID假定您使用的是VB6(因为您没有指定.NET),您可以使用以下代码: ''#Module-level WinAPI Declarations Private Const PROCESS_ALL_ACCESS = &H1F0FFF Private Const TH32CS_SNAPPROCESS As Long = 2& Private Type PROCESSENTRY32 dwSize A

我想向其他正在运行的进程发送关闭消息

为此,我有这个过程的名称


非进程ID假定您使用的是VB6(因为您没有指定.NET),您可以使用以下代码:

''#Module-level WinAPI Declarations
Private Const PROCESS_ALL_ACCESS = &H1F0FFF 
Private Const TH32CS_SNAPPROCESS As Long = 2& 

Private Type PROCESSENTRY32 
    dwSize As Long 
    cntUsage As Long 
    th32ProcessID As Long 
    th32DefaultHeapID As Long 
    th32ModuleID As Long 
    cntThreads As Long 
    th32ParentProcessID As Long 
    pcPriClassBase As Long 
    dwFlags As Long 
    szexeFile As String * 260 
End Type 

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long 
Private Declare Function ProcessFirst Lib "kernel32.dll" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function ProcessNext Lib "kernel32.dll" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function CreateToolhelpSnapshot Lib "kernel32.dll" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long 
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

''#Public function to actually kill a process, given its name
Public Sub KillProcess(ByVal ProcessName As String)
    Dim uProcess As PROCESSENTRY32 
    Dim RProcessFound As Long 
    Dim hSnapshot As Long 
    Dim SzExeName As String 
    Dim ExitCode As Long 
    Dim MyProcess As Long 
    Dim AppKill As Boolean 
    Dim AppCount As Integer 
    Dim i As Integer

    If LenB(ProcessName) <> 0 Then 
        AppCount = 0 

        uProcess.dwSize = Len(uProcess) 
        hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) 
        RProcessFound = ProcessFirst(hSnapshot, uProcess) 

        Do 
            i = InStr(1, uProcess.szexeFile, Chr(0)) 
            SzExeName = LCase$(Left$(uProcess.szexeFile, i - 1)) 

            If Right$(SzExeName, Len(ProcessName)) = LCase$(ProcessName) Then 
                AppCount = AppCount + 1 
                MyProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) 
                AppKill = TerminateProcess(MyProcess, ExitCode) 
                Call CloseHandle(MyProcess) 
            End If

            RProcessFound = ProcessNext(hSnapshot, uProcess) 
        Loop While RProcessFound 

        Call CloseHandle(hSnapshot) 
    End If 
End Sub 
模块级WinAPI声明 私有常量进程\u所有\u访问=&H1F0FFF Private Const TH32CS_SNAPPROCESS长=2& 私有类型PROCESSENTRY32 大小与长度相同 只要 th32ProcessID尽可能长 这段时间很长 th32ModuleID尽可能长 线程长度相同 th32ParentProcessID的长度为 pcPriClassBase尽可能长 把旗子拖得一样长 szexeFile作为字符串*260 端型 私有声明函数OpenProcess Lib“kernel32.dll”(ByVal dwDesiredAccess尽可能长,ByVal blnheritHandle尽可能长,ByVal dwAppProcessId尽可能长)尽可能长 私有声明函数ProcessFirst Lib“kernel32.dll”别名“Process32First”(ByVal hSnapshot为Long,uProcess为PROCESSENTRY32)为Long 私有声明函数ProcessNext Lib“kernel32.dll”别名“Process32Next”(ByVal hSnapshot为Long,uProcess为PROCESSENTRY32)为Long 私有声明函数CreateToolhelpSnapshot Lib“kernel32.dll”别名“CreateToolhelp32Snapshot”(ByVal lFlags为Long,lProcessID为Long)为Long 私有声明函数TerminateProcess Lib“kernel32.dll”(ByVal ApphProcess为Long,ByVal uExitCode为Long)为Long 私有声明函数CloseHandle Lib“kernel32.dll”(ByVal hObject作为Long)作为Long ''#公共函数实际杀死一个进程,给定其名称 公共子进程(ByVal ProcessName作为字符串) 作为PROCESSENTRY32的Dim UpAccess 发现暗淡的RProcess尽可能长 暗淡的hSnapshot尽可能长 名称为字符串 将退出代码变长 把我的过程弄得很长 Dim AppKill作为布尔值 Dim AppCount为整数 作为整数的Dim i 如果LenB(ProcessName)为0,则 AppCount=0 uprecess.dwSize=Len(uprecess) hSnapshot=CreateToolhelpSnapshot(TH32CS\u SNAPPROCESS,0&) RProcessFound=ProcessFirst(hSnapshot、uprouss) 做 i=InStr(1,uProcess.szexeFile,Chr(0)) SzExeName=LCase$(左$(upaccess.szexeFile,i-1)) 如果右$(SzExeName,Len(ProcessName))=LCase$(ProcessName),则 AppCount=AppCount+1 MyProcess=OpenProcess(PROCESS\u ALL\u ACCESS,False,upaccess.th32ProcessID) AppKill=TerminateProcess(MyProcess,ExitCode) 调用CloseHandle(MyProcess) 如果结束 RProcessFound=ProcessNext(hSnapshot、uProcess) 找到RProcess时循环 呼叫关闭手柄(hSnapshot) 如果结束 端接头 基本上,这段代码所做的是枚举所有当前正在运行的进程,以便找到要终止的进程。返回进程的快照,然后我们使用和函数循环浏览该快照。当它找到与您指定的名称匹配的名称时,它将使用终止该进程及其所有线程请注意,这未在XP后版本的Windows上进行测试。

如果您能流利地使用Win32,请参阅以下MSDN文章:

您在Internet上找到的许多示例(例如)用于向与特定进程相关联的窗口发送一个。这样做的好处是,它要求很好地发送
WM_CLOSE
消息,使流程有机会保存任何数据并优雅地退出<代码>终止进程,正如上面的例子中所使用的,并不是很好,它只是一个瞬间。但它将允许您结束不拥有任何窗口的进程。你没有提到这是否是问题中的要求

(老实说,问题中没有足够的细节让我有足够的理由来回答这个问题,但我在拖延。如果你还需要其他什么,请编辑你的问题以包含更多细节,并添加评论让我知道……)