eine weitere Lösung ist immer interessant, aber das Problem
war inzwischen gelöst. SendMessage Handle, &H10, 0, 0 genügt,
weiß ich inzwischen. Das Handle ist bekannt … 
Wenn Du eine Variante hat, die auch funktioniert, wenn das
Handle schwer zu finden ist, weil sich der Fenstertitel
verändert und man das Programm nicht selbst gestartet hat,
interessiert mich das sogar sehr, für den Fall habe ich
nämlich noch keine Lösung. 
Hallo Rainer,
auf welche Excel-Version(en) hast du eigentlich Zugriff?
so wie ih das mit meinem bescheidenen API-Überblick sehe, schaut sich der Code alle Fenster/Prozesse an und da wo die eingegebene Exe dahintersteckt lösht er den Prozess.
Ich muß weder PID, Handle noch Fenstertitel kennen.
(Nachfolgend der Code von Michael Schwimmer. In seinem Buch „Excel Vba“, Isbn: 3-8273-2183-2 Buch anschauen steht vorne nur daß die gewerbliche Nutzung untersagt ist, von privater Nutzung steht da nix, also poste ich den Code.)
Hier die Datei:
http://www.hostarea.de/server-09/September-639e0796e…
Gruß
Reinhard
Der Code für den StartButton:
Option Explicit
'
Private Sub CommandButton1\_Click()
Dim Exename As String
Exename = Range("A1")
If Exename = "" Then Exit Sub
'Teilname der .exe
MsgBox KillProcess(Exename) & vbCrLf & "Prozesse abgeschossen", vbOKOnly, Exename
End Sub
Code im Modul1:
Option Explicit
'
Private Const MAX\_PATH = 260
Private Const TH32CS\_SNAPPROCESS As Long = 2
Private Const PROCESS\_ALL\_ACCESS = &H1F0FFF
'
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 \* MAX\_PATH
End Type
'
Private Declare Function CreateToolhelp32Snapshot \_
Lib "kernel32" ( \_
ByVal dwFlags As Long, \_
ByVal th32ProcessID As Long \_
) As Long
'
Private Declare Function CloseHandle Lib "kernel32" ( \_
ByVal hObject As Long \_
) As Long
'
Private Declare Function Process32First Lib "kernel32" ( \_
ByVal hlngSnapshot As Long, \_
ByRef lppe As PROCESSENTRY32 \_
) As Long
Private Declare Function Process32Next Lib "kernel32" ( \_
ByVal hlngSnapshot As Long, \_
ByRef lppe As PROCESSENTRY32 \_
) As Long
'
Private Declare Function OpenProcess Lib "kernel32" ( \_
ByVal dwDesiredAccess As Long, \_
ByVal bInheritHandle As Long, \_
ByVal dwProcessId As Long \_
) As Long
'
Private Declare Function TerminateProcess Lib "kernel32" ( \_
ByVal lngProcess As Long, \_
ByVal uExitCode As Long \_
) As Long
'
Sub Test()
'Teilname der .exe
MsgBox KillProcess("notepad") & vbCrLf & \_
"Prozesse abgeschossen", vbOKOnly, "notepad"
End Sub
'
Public Function KillProcess( \_
strExeName As String \_
) As Long
Dim lngSnapshot As Long
Dim udtProzessinfo As PROCESSENTRY32
Dim lngRet As Long
Dim lngProcess As Long
Dim strName As String
'Schnappschuss aller momentan laufenden Prozesse erzeugen
lngSnapshot = CreateToolhelp32Snapshot(TH32CS\_SNAPPROCESS, 0&:wink:
With udtProzessinfo
.dwSize = Len(udtProzessinfo)
'Infos über ersten Prozess
lngRet = Process32First(lngSnapshot, udtProzessinfo)
Do While lngRet
' Durchlaufen, solange lngRet Null ist
' Beim ersten Auftreten von chr(0) kürzen
strName = StringFromASCIIZ(.szExeFile)
If InStr(1, LCase(strName), LCase(strExeName)) Then
'Richtige ausführbare Datei gefunden
'Prozesshandle holen
lngProcess = OpenProcess(PROCESS\_ALL\_ACCESS, \_
0, .th32ProcessID)
If lngProcess Then
'Prozess schonungslos abschießen
TerminateProcess lngProcess, 0&
' Anzahl abgeschossener Prozesse zurückgeben
KillProcess = KillProcess + 1
'Handle schließen
CloseHandle lngProcess
End If
End If
'Infos über nächsten Prozess
lngRet = Process32Next(lngSnapshot, udtProzessinfo)
Loop
End With
'Handle schließen
CloseHandle lngSnapshot
End Function
'
Private Function StringFromASCIIZ(ASCIIZ As String)
'ASCIIZ String kürzen
If InStr(1, ASCIIZ, Chr(0)) \> 0 Then
StringFromASCIIZ = Left$(ASCIIZ, InStr(1, ASCIIZ, Chr(0)) - 1)
Else
StringFromASCIIZ = ASCIIZ
End If
End Function