thomas1972
Goto Top

VBA und ACCESS - Mehrere gleichnamige Prozesse auslesen - Einen bestimmten ermitteln, in den Vordergrund holen und Tastaturbefehle per sendkey übermitteln

Hallo,

ich habe eine Frage,

ich habe Programme (CSB.exe) die vom Ursprung her gleich sind.
Ich starte nun alle 3 Programme mit verschiedenen Parametern, diese habe ich im Taskmanager unter Prozesse den " csb.exe" Prozess 3 mal stehen, also:
csb.exe
csb.exe
csb.exe

Fensterbezeichnung
"12345 Testumgebung..."
"47894 Testumgebung..."
"78945 Testumgebung..."

Wie kann ich in den aktiven Prozess wechseln, welcher in der Fensterbezeichnung (WindowTitle) "12345 Testumgebung..." den Namen 12345 stehen hat
und im Anschluss dort per Sendkey Befehle übermitteln,
im Vorfeld soll geprüft werden ob der Prozess / Programm mit Fensterbezeichnung 12345 überhaut gestartet ist.

Wie kann ich dieses über Access und VBA am besten lösen?

Über Eure Hilfe wäre ich dankbar.

Grüße aus München

Content-ID: 306386

Url: https://administrator.de/forum/vba-und-access-mehrere-gleichnamige-prozesse-auslesen-einen-bestimmten-ermitteln-in-den-vordergrund-holen-und-306386.html

Ausgedruckt am: 23.12.2024 um 01:12 Uhr

colinardo
colinardo 07.06.2016 aktualisiert um 12:34:02 Uhr
Goto Top
Hallo Thomas1972,
kannst du so machen:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long  
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long  
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long  
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long  
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long  

'Sub sucht dein Fenster und wenn es gefunden wurde wird es aktiviert und Tastendrücke an es gesendet  
Private Sub FindMyWindow()
    Dim lngHandle As Long
    Set objShell = CreateObject("wscript.shell")  
    If GetHandleFromCaption(lngHandle, "12345 Testumgebung") = True Then  
        'Fenster aktivieren  
        SetForegroundWindow lngHandle
        'Tastendrücke senden  
        objShell.SendKeys ("BlaBlaBlaBla")  
    Else
        MsgBox "Fenster wurde nicht gefunden!", vbExclamation  
    End If
    set objShell = Nothing
End Sub

' Funktion das Fenster anhand des Titels sucht  
Private Function GetHandleFromCaption(ByRef lWnd As Long, ByVal sCaption As String) As Boolean
    Dim lhWndP As Long, sStr As String
    GetHandleFromPartialCaption = False
    lhWndP = FindWindow(vbNullString, vbNullString)
    Do While lhWndP <> 0
        sStr = String(GetWindowTextLength(lhWndP) + 1, Chr$(0))
        GetWindowText lhWndP, sStr, Len(sStr)
        sStr = Left$(sStr, Len(sStr) - 1)
        If InStr(1, sStr, sCaption) > 0 Then
            GetHandleFromCaption = True
            lWnd = lhWndP
            Exit Do
        End If
        lhWndP = GetWindow(lhWndP, 2)
    Loop
End Function
Grüße Uwe

<< edit >> Korrektur einer Variablen
thomas1972
thomas1972 07.06.2016 um 16:12:54 Uhr
Goto Top
Hallo Uwe,

danke für dieses Script..
funktioniert soweit ganz gut
nun muss ich nur schauen wie bekomme ich variablen in die Zwischenablage und per Sendkey dann in das aktive vorgeblendete Feld im geöffnetem Programm.

grüße aus münchen


Thomas
colinardo
Lösung colinardo 07.06.2016 aktualisiert um 16:58:30 Uhr
Goto Top
Zitat von @thomas1972:
nun muss ich nur schauen wie bekomme ich variablen in die Zwischenablage und per Sendkey dann in das aktive vorgeblendete Feld im geöffnetem Programm.
Clipboard setzen, kein Problem
' Hinweis: Zur Verwendung einen Verweis zur Bibliothek "Microsoft Forms 2.0 Object Library" hinzufügen  
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.SetText "Das ist mein Text"  
clipboard.PutInClipboard
Per SendKeys dann ein STRG+V
objShell.SendKeys("^v")

Man kann aber auch Controls einer Anwendung direkt per Message-API (SendMessage()) ansprechen und den Text setzen, aber denke das wird für dich zu kompliziert. Außerdem müsste ich dazu an deinem Rechner sitzen um die Control-interne ID zu extrahieren.

Für Anfänger einfacher ist das per AutoIt-EXE, das hat ein Tool namens AutoIt-WindowInfo mit dem man die Control-IDs anzeigen lassen kann.
colinardo
colinardo 15.07.2016 um 18:44:34 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.