Я хочу отправить Закрыть Messge других выполняющихся процессаВ Vb Как отправить сообщение о завершении к другому запущенному процессу?
Для этого у меня есть имя этого процесса
Не Process ID
Я хочу отправить Закрыть Messge других выполняющихся процессаВ Vb Как отправить сообщение о завершении к другому запущенному процессу?
Для этого у меня есть имя этого процесса
Не Process ID
Предполагая, что вы используете VB 6 (так как вы не сделали указать .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
в основном то, что делает этот код является перечисление всех запущенных процессов, чтобы найти тот, который вы хотите убить. CreateToolHelpSnapshot
API function возвращает моментальный снимок процессов, а затем мы просматриваем этот моментальный снимок с помощью функций и Process32Next
. Когда он находит совпадение с указанным вами именем, он использует TerminateProcess
function для завершения этого процесса и всех его потоков. Обратите внимание, что это не проверено в версиях Windows после XP.
Если говорить Win32 свободно, обратитесь к следующей MSDN статье: Taking a Snapshot and Viewing Processes
Много примеров вы найдете в Интернете (например, option one, option two) используют EnumWindows
отправить WM_CLOSE
message к окнам, связанным с особый процесс. Преимущество этого заключается в том, что он запрашивает красивую отправку сообщения WM_CLOSE
, что дает возможность сохранить любые данные и выйти изящно. TerminateProcess
, как используется в приведенном выше примере, не так хорош - это мгновение buzz-kill. Но это будет позволит вам завершить процессы, которые не имеют никаких окон. Вы не упомянули, было ли это требование в вопросе.
(Честно говоря, в моем вопросе не хватает деталей, чтобы иметь любой бизнес пытается ответить на этот вопрос, но я затягиваю. Если вам нужно что-нибудь еще, отредактируйте свой вопрос, чтобы включить более подробную информацию и добавьте комментарий, чтобы сообщить мне об этом ...)
vb6 или .net - это квестон? – rerun 2010-12-10 14:57:01