Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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
Antworten 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
Antworten 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.
Antworten 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
Antworten 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
Antworten Top
#6
Hallo,

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

mfg
Antworten Top
#7
was meinst Du da genau?
Antworten 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
Antworten 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
Antworten Top


Gehe zu:


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