Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1328to1332
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ext. Programm schließen

ext. Programm schließen
03.09.2013 19:30:20
Sven

Hallo zusammen,
was ich mit:
Set wshShell = CreateObject("WScript.Shell")
wshShell.Run "C:\Programme\PDF24\pdf24.exe"
geöffnet bekomme, möchte ich auch mit einem VBA-Code schließen.
Kann mir bitte jemand weiterhelfen?
Danke - Gruß Sven

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ext. Programm schließen
03.09.2013 20:42:01
Nepumk
Hallo,
aber nicht mit der WScrip.Shell. Ich frag mich wieso du das benutzt, wenn es in Excel doch die Shell-Funktion gibt.
Beispiel:
Option Explicit

Private Declare Function GetParent Lib "user32.dll" ( _
    ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
Private Declare Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpdwprocessid As Long) As Long
Private Declare Function PostMessageA Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const GW_HWNDNEXT As Long = 2
Private Const WM_CLOSE As Long = &H10

Public Sub Test()
    
    Dim lngProcessId As Long, lngHwnd As Long
    
    lngProcessId = Shell("C:\Windows\system32\notepad.exe", vbNormalFocus)
    
    
    'mach was
    
    
    lngHwnd = GetWindowHandle(lngProcessId)
    
    If lngHwnd <> 0 Then Call PostMessageA(lngHwnd, WM_CLOSE, 0&, 0&)
    
End Sub

Private Function GetWindowHandle(ByVal pvlngProcessId As Long) As Long
    
    Dim lngHwnd As Long, lngProcessId As Long
    
    lngHwnd = FindWindowA(vbNullString, vbNullString)
    
    Do Until lngHwnd = 0
        
        If GetParent(lngHwnd) = 0 Then
            
            Call GetWindowThreadProcessId(lngHwnd, lngProcessId)
            
            If pvlngProcessId = lngProcessId Then
                
                GetWindowHandle = lngHwnd
                
                Exit Do
                
            End If
        End If
        
        lngHwnd = GetWindow(lngHwnd, GW_HWNDNEXT)
        
    Loop
End Function

Gruß
Nepumuk

Anzeige
AW: ext. Programm schließen
04.09.2013 09:55:34
Sven
Hallo Nepumuk,
danke, aber ich komme damit nicht ganz klar. Ich möchte mein Programm nicht mit dem selben Makro kurz nach dem Öffnen schließen, sondern mit einem 2. Makro. Nun hab ich probiert die Sache zu trennen, aber es schließt sich nicht.
("aber nicht mit der WScrip.Shell." ist nicht auf meinem Mist gewachsen - aber ging)
Gruß Sven
Public Sub Test()
Dim lngProcessId As Long, lngHwnd As Long
lngProcessId = Shell("C:\Programme\PDF24\pdf24.exe", vbNormalFocus)
'mach was
End Sub

'mach was

Public Sub Test2()
Dim lngProcessId As Long, lngHwnd As Long
lngHwnd = GetWindowHandle(lngProcessId)
If lngHwnd <> 0 Then Call PostMessageA(lngHwnd, WM_CLOSE, 0&, 0&)
End Sub

Anzeige
AW: ext. Programm schließen
04.09.2013 10:03:17
Nepumk
Hallo,
na dann mach halt aus der ProcessId eine lokale Variable.
Option Explicit

Private Declare Function GetParent Lib "user32.dll" ( _
    ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
Private Declare Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpdwprocessid As Long) As Long
Private Declare Function PostMessageA Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

Private Const GW_HWNDNEXT As Long = 2
Private Const WM_CLOSE As Long = &H10

Private llngProcessId As Long

Public Sub Starten()
    
    llngProcessId = Shell("C:\Windows\system32\notepad.exe", vbNormalFocus)
    
    'mach was
    
End Sub

Public Sub Beenden()
    
    Dim lngHwnd As Long
    
    lngHwnd = GetWindowHandle(llngProcessId)
    
    If lngHwnd <> 0 Then Call PostMessageA(lngHwnd, WM_CLOSE, 0&, 0&)
    
End Sub

Private Function GetWindowHandle(ByVal pvlngProcessId As Long) As Long
    
    Dim lngHwnd As Long, lngProcessId As Long
    
    lngHwnd = FindWindowA(vbNullString, vbNullString)
    
    Do Until lngHwnd = 0
        
        If GetParent(lngHwnd) = 0 Then
            
            Call GetWindowThreadProcessId(lngHwnd, lngProcessId)
            
            If pvlngProcessId = lngProcessId Then
                
                GetWindowHandle = lngHwnd
                
                Exit Do
                
            End If
        End If
        
        lngHwnd = GetWindow(lngHwnd, GW_HWNDNEXT)
        
    Loop
End Function

Gruß
Nepumuk

Anzeige
AW: ext. Programm schließen
04.09.2013 12:09:30
Sven
alles klar,
nun hab ich's.
Es geht, danke.
Gruß
Sven

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige