开发者

In Vb How TO Send Terminate message To other running Process?

开发者 https://www.devze.com 2023-01-30 03:19 出处:网络
I want to send Close Messge To Other Running Process For that i have the name of that process Not Process开发者_高级运维 IDAssuming you\'re using VB 6 (because you didn\'t specify .NET), you could t

I want to send Close Messge To Other Running Process

For that i have the name of that process

Not Process开发者_高级运维 ID


Assuming you're using VB 6 (because you didn't specify .NET), you could the following code:

''#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 

Basically what this code does is enumerate all currently running processes in order to find the one you want to kill. The CreateToolHelpSnapshot API function returns a snapshot of the processes, and then we loop through this snapshot with the Process32First and Process32Next functions. When it finds a match to the name you specified, it uses the TerminateProcess function to terminate that process and all of its threads. Note that this is untested on post-XP versions of Windows.

If you speak Win32 fluently, see the following MSDN article: Taking a Snapshot and Viewing Processes

Lots of the examples you find on the Internet (i.e., option one, option two) use EnumWindows to send a WM_CLOSE message to the windows associated with a particular process. The advantage of this is that it asks nicely—sending the WM_CLOSE message gives the process a chance to save any data and exit gracefully. TerminateProcess, as used in the above example, is not so nice—it's an instant buzz-kill. But it will allow you to end processes that don't own any windows. You didn't mention if this was a requirement in the question.

(Honestly, there isn't enough detail in the question for me to have any business trying to answer this question, but I'm procrastinating. If you need anything else, please edit your question to include more details and add a comment to let me know...)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号