Je veux envoyer Fermer messge Pour Autre processus en coursIn Vb Comment envoyer un message Terminate à un autre processus en cours?
Pour que j'ai le nom de ce processus
Non ID de processus:
Je veux envoyer Fermer messge Pour Autre processus en coursIn Vb Comment envoyer un message Terminate à un autre processus en cours?
Pour que j'ai le nom de ce processus
Non ID de processus:
En supposant que vous utilisez VB 6 (parce que vous ne l'avez pas spécifiez .NET), vous pourriez le code suivant:
''#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
Fondamentalement, ce que ce code est fait d'énumérer tous les processus en cours d'exécution afin de trouver celui que vous voulez tuer. Le CreateToolHelpSnapshot
API function renvoie un instantané des processus, puis nous parcourons cet instantané avec les fonctions Process32First
et Process32Next
. Lorsqu'il trouve une correspondance avec le nom que vous avez spécifié, il utilise le TerminateProcess
function pour terminer ce processus et tous ses threads. Notez que ceci n'est pas testé sur les versions post-XP de Windows.
Si vous parlez Win32 couramment, consultez l'article MSDN suivant: Taking a Snapshot and Viewing Processes
Beaucoup des exemples que vous trouverez sur Internet (c.-à-option one, option two) utiliser EnumWindows
envoyer un WM_CLOSE
message aux fenêtres associées à une processus particulier. L'avantage de ceci est qu'il demande gentiment-envoyer le message WM_CLOSE
donne au processus une chance d'enregistrer des données et quitter gracieusement. TerminateProcess
, comme utilisé dans l'exemple ci-dessus, n'est pas si agréable, c'est un instant buzz-kill. Mais il vous permettra de mettre fin à des processus qui ne possèdent aucune fenêtre. Vous n'avez pas mentionné si c'était une exigence dans la question.
(Honnêtement, il n'y a pas suffisamment de détails dans la question pour moi d'avoir toute entreprise essayer de répondre à cette question, mais je tergiverser. Si vous avez besoin d'autre chose, s'il vous plaît modifier votre question d'inclure plus de détails et ajouter un commentaire pour me le faire savoir ...)
vb6 ou .net est le queston? – rerun