Wie kann man per VBA ein fremdes Programm (zB Rechner, Outlook) beenden?
Mit "Shell kann ich ein Programm starten. Doch wie kann ich es per VBA Prozedur wieder schließen? Gibt's dafür eine simple Lösung?
Option Explicit
Private Declare Function OpenProcess Lib "kernel32.dll" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" ( _
ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Private Const PROCESS_TERMINATE = &H1
Private Const PROCESS_VM_READ = &H10
Private lvntTaskId As Long
'Beispiel für Outlook**************************************************************************
Public Sub Open_Outlook()
'Eventuell Pfad anpassen
lvntTaskId = Shell("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE", vbMaximizedFocus)
End Sub
Public Sub Close_Outlook()
Dim lngHandle As Long
If lvntTaskId <> 0 Then
lngHandle = OpenProcess(PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, lvntTaskId)
If lngHandle <> 0 Then Call TerminateProcess(lngHandle, 0&)
End If
End Sub
'***********************************************************************************************
'Beispiel für Rechner**************************************************************************
Public Sub Open_Rechner()
'Eventuell Pfad anpassen
lvntTaskId = Shell("C:\Windows\System32\calc.exe", vbMaximizedFocus)
End Sub
Public Sub Close_Rechner()
Dim lngHandle As Long
If lvntTaskId <> 0 Then
lngHandle = OpenProcess(PROCESS_VM_READ Or PROCESS_TERMINATE, 0&, lvntTaskId)
If lngHandle <> 0 Then Call TerminateProcess(lngHandle, 0&)
End If
End Sub
'***********************************************************************************************
Gruß Tino
Option Explicit
Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" ( _
ByVal byteVirtualKeycode As Byte, _
ByVal byteScan As Byte, _
ByVal lFlags As Long, _
ByVal lExtraInfo As Long)
Private Sub CheckNumLock() 'zum aktivieren der Num-Lock Taste
Const KEYEVENTF_KEYUP As Long = &H2
Const VK_NUMLOCK = &H90
If Not (GetKeyState(vbKeyNumlock) = 1) Then
keybd_event VK_NUMLOCK, 1, 0, 0
keybd_event VK_NUMLOCK, 1, KEYEVENTF_KEYUP, 0
End If
End Sub
Sub test()
AppActivate "- Microsoft Outlook"
Application.SendKeys "%{F4}"
Call CheckNumLock 'Bug bei SendKeys, Num- Taste wieder aktivieren.
End Sub
Gruß Tino
Sub Outlook_beenden()
Dim objWMI As Object, objProcess As Object
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objProcess = objWMI.ExecQuery _
("Select * from Win32_Process Where Name = 'OUTLOOK.exe'")
On Error Resume Next
For Each objProcess In objProcess
objProcess.Terminate
Next
If Err.Number <> 0 Then MsgBox "Es sind fehler aufgetreten beim versuch Outlook zu beenden!", vbCritical
Set objProcess = Nothing: Set objWMI = Nothing
End Sub
Gruß Tino