aktive Fenster abfragen
#1
Hallo zusammen, ich schon wieder,

diesmal geht es sicher, ich bekomme es nur nicht hin.
ich starte per VBA snip:

Code:
   Call ShellExecute(0, "open", strPfad, "", "", SW_SHOWNORMAL)
   Application.Wait Now + TimeSerial(0, 0, 30)
   AppActivate "Zeiten"
ein externes Programm welches Daten ausliest und mir dann einen Bericht zur Verfügung stellt den ich auswerten muss.

Wie kann ich den "Pause"-teil so ändern das abgefragt wird ob das Fenster "Zeiten" schon da ist? Hintergrund ist das das Programm nicht das schnellste ist und danach per sendkeys weitergemacht wird, und manchmal reichen die 30 Sekunden nicht aus das das Fenster dann schon verfügbar is, aber das interessiert das Makro nicht, das macht dann einfach weiter.

Wie kann ich das so umbauen das er Pause macht bis das Programm verfügbar ist?

LG Matty
Top
#2
Hallo,

bevor die Spezialisten die perfekte Lösung zeigen, hier ein Vorschlag:

Nach dem gezeigten Start des externen Programms mit dem Taskmanager prüfen, ob dieses Programm noch läuft (setzt voraus, dass am Ende der Aufgabe das PRogramm auch geschlossen wird).

Aus xl kann man in MS Word die Funktion "Application.Tasks" aufrufen und die activen Taks auslesen.

mfg
Top
#3
Hallo,
das klappt so leider ncht.
Das Programm an sich läuft die ganze zeit und über ein Makro wird jede halbe Stunde ein Skript gestartet welches die Daten ausliest und dann in einem Ergebnisfenster (deswegen App-Activate "Zeiten" so der Titel des Fensters) anzeigt. Aus dem werden die Daten exportiert werden und dieses Fenster wird dann wieder geschlossen. Das Programm an sich bleibt den ganzen Tag offen.
Top
#4
Hallo,

ok, so geht es nicht.

Aber es muss ein Kriterium geben, dass man abfragen kann und damit das Ende der Berechnung prüfen. Mit API's kann man zwar offene Fenster prüfen, aber nicht, ob ein Skript bereits durchgelaufen ist.

Gibt bitte weitere Information, an denen dann eine Abfrage ansetzen kann.

mfg
Top
#5
Hallo,
ich hoffe das man irgendwie eine Pause einbauen kann bis das entsprechende Fenster verfügbar ist so in der Art: If fenster "Zeiten" verfügbar then weiter im text, else wait 5 sekunden und erneute Prüfung
Top
#6
Hallo,

kennst du die API's, die die Existenz eines Fentsern prüfen?

mfg
Top
#7
was meinst Du da genau?
Top
#8
Hallo,

dieser Code ist aus dem Archiv und müßte für dein Problem angepasst werden. Es geht hier nur um das PRinzip.


Code:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessageLong& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
Const WM_CLOSE = &H10

Private Sub Fenster_schliessen()
Dim lpClassName As String
Dim lpCaption As String
Dim Hnd As Long

'Const NILL = 0&
'Const WM_SYSCOMMAND = &H112
'Const SC_CLOSE = &HF060&

'lpClassName = "SciCalc" 'NICHT NÖTIG
lpCaption = "Rechner" '"Mappe1 - Excel"

Hnd = FindWindow(vbNullString, lpCaption$)
   Debug.Print Hnd

'Close Window
Call SendMessageLong(Hnd, WM_CLOSE, 0&, 0&)
If Hnd = 0 Then
  Debug.Print "Error: window not present.", lpClassName
   Exit Sub
End If

End Sub


Funktionen mit "Hnd" sollte dir zumindest etwas bekannt sein.

mfg
Top
#9
Hallo,
ich hab nochmal bischen im Netz gewühlt und es dann so gelöst:

Code:
Call ShellExecute(0, "open", strPfad, "", "", SW_SHOWNORMAL)
   On Error Resume Next
       Do
       Err.Clear
       z = z + 1
       If z = 60 Then Exit Sub
       Application.Wait Now + TimeValue("0:00:02")
       DoEvents
       AppActivate "Zeiten"
       Loop Until Err = 0
   On Error GoTo 0

tut was es soll Smile

Danke an alle und bis zur nächsten frage, wird sicher nicht lange dauern..

LG Matty
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste