Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1160to1164
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

fremde Fenster aktivieren

fremde Fenster aktivieren
chris
Hallo liebe excel und VBA profis,
ich habe heute eine schwere frage und komme nicht weiter.
Würde mich sehr über Hilfe freuen.
Habe mit Hilfe des Forums(woher genau) weiß ich leider nicht mehr folgenden Code erstellt.
Dieser soll mir dazu dienen SAP Fenster zu aktivieren.
das klappt auch super.Aber leider weiß ich nicht wie ich prüfen kann ob das fenster jetzt aktiv ist oder nicht.
Mein Programm macht einfach weiter.
Egal ob fenster aktiv oder nicht.
Könnt ihr mir helfen und sagen was ich machen könnte das es erst weiter gehtw enn das fenster aktiv ist ? Und sonst nach z.b 5 sekunden abbricht ?
Vielen Dank im voraus
gruß Chris

Sub SAP_Makro()
'SAP Fenster aktivieren
Fenster_aktivieren "Material ändern"
''''''Mein Code ....
'SAP Fenster aktivieren
Fenster_aktivieren "testfenster"
'... weiter mein code
End Sub

Und in einem Extra Modul habe ich diesen code:

Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) _
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 GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal wIndx As _
Long) As Long
Private Declare Function ShowWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Const GWL_STYLE& = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Const GW_HWNDNEXT& = 2
Const GW_CHILD& = 5
Public OK As Boolean
Const iNormal& = 1
'Const iMinimized& = 2
'Const iMaximized& = 3
Sub Fenster_aktivieren(FensterName)
Dim hwnd As Long
Dim STitel As String
STitel = FensterName 'hier einen Teil vom Fenster Titel angeben
hwnd = GetDesktopWindow()
hwnd = GetWindow(hwnd, GW_CHILD)
GetWindowInfo hwnd, STitel, False
Do While hwnd  0
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
If GetWindowInfo(hwnd, STitel, False) = hwnd Then   ' False alle Fenster , true nur  _
sichtbare Fenster
ShowWindow hwnd, iNormal&
SetForegroundWindow hwnd 'aktivieren
End If
Loop
End Sub
Private Function GetWindowInfo(ByVal hwnd&, STitel$, Optional booVisible As Boolean = True) As  _
Long
Dim Result&, Style&, Title$
'Darstellung des Fensters
Style = GetWindowLong(hwnd, GWL_STYLE)
Style = Style And (WS_VISIBLE Or WS_BORDER)
'Fensetrtitel ermitteln
Result = GetWindowTextLength(hwnd) + 1
Title = Space$(Result)
Result = GetWindowText(hwnd, Title, Result)
Title = Left$(Title, Len(Title) - 1)
'prüfen ob Fenster Sichtbar
If (Style = (WS_VISIBLE Or WS_BORDER)) Or booVisible = False Then
If Title Like "*" & STitel & "*" Then
GetWindowInfo = hwnd
Exit Function
End If
End If
GetWindowInfo = 0
End Function

AW: Code wartet nicht auf Fenster
15.06.2010 14:24:11
chris
Hallo Martin,
danke für Deinen Code.
Aber es ist ja der gleiche den ich auch habe.
Zumindest ähnlich...
Er wartet auch nicht bis das fenster aktiviert werden kann.
Sondern versucht es nur einmal und dann ist Ende.
Danke noch einmal für weitere Hilfe an alle !
gruß Chris
AW: Code wartet nicht auf Fenster
15.06.2010 19:22:48
Martin
Hallo Chis,
sucht etwas in dieser Art?:
Sub Schleife()
Dim WarteBis As Date
WarteBis = Now + TimeSerial(0, 0, 5)
Do Until 1 = 2
If Now > WarteBis Then
MsgBox "Zeit ist abgelaufen"
End
End If
Loop
MsgBox "Bedingung erfüllt"
End Sub
Natürlich tritt der Fall 1 = 2 nie ein. Hier musst du abfragen, ob der Fenstername der richtige ist.
Viele Grüße
Martin
Anzeige
AW: fremde Fenster aktivieren
15.06.2010 14:53:18
Ramses
Hallo
"...Könnt ihr mir helfen und sagen was ich machen könnte das es erst weiter gehtw enn das fenster aktiv ist ..."
Ich versteh die Frage nicht. Das Makro aktiviert das Fenster, wenn es denn ein solches gibt.
Wenn nicht,... kann das Makro auch nichts machen, ausser einem Hinweis, dass das Fenster gestartet werden soll.
Eine solche Code-Variante halte ich persönlich aber höchst kritisch.
Wenn es denn sein muss, dann nur folgendes
Dein Makro in Einzelsegmente zerlegen, und beim Fenster-Aktivieren eine globale Variable TRUE oder FALSE setzen. Wenn FALSE, dann mit Application.Ontime DIESES Code segment in 5 Sekunden neu aufrufen
Eine andere Variante fällt mir dazu nicht ein.
Gruss Rainer
Anzeige
AW: fremde Fenster aktivieren
15.06.2010 14:59:27
chris
Hallo Rainer,
danke für deine Antwort...
''Ich versteh die Frage nicht. Das Makro aktiviert das Fenster, wenn es denn ein solches gibt.
ja das ist ja auch richtig so... Aber das Makro das ich gepostet habe arbeitet auch weiter wenn es dieses Fenster nicht gibt.Das ist das Problem.
Es kommt keine meldung das das fremde Fenster nicht gefunden wurde.
Das ist es was ich gerne möchte.
Danke gruß
AW: fremde Fenster aktivieren
17.06.2010 21:32:41
volti
Hallo Chris,
falls Dich die Frage imer noch beschäftigt, hier folgender Gedankenanstoß:
Ich beschäftige mich auch oft mit so'n Kram, habe aber grad den konkreten code nicht parat, kann ihn aber hier mal posten, wenn gewünscht.
Du solltest in einer Warteschleife mit Timeoutfunktion feststellen, ob irgendwann, z.B. nach Start der Anwendung durch User oder Shell, Shellexecute das gewünschte Fenster geladen ist.
Festellen ob Fenster im Memory geladen ist und Fenstername schon bekannt ist: hWnd=FindWindow(vbnull, Fenstername)
Das Fenster per Code in den Vordergrund setzen oder in einer Schleife mit Timeoutfunktion warten, bis es in den Vordergrund kommt und dann Deine Actions abssetzen.
Feststellen, ob Fenster für Mouse oder Key-Actions bereit: if hwnd=getforegroundwindow() then ......
Falls Dir nur Fragmente des Fensternamens bekannt sind, wird es etwas umfangreicher, weil Du dann über GetwindowNext() usw. in einer Schleife alle Fenster abklappern musst.
Also, dies ist nur ein Tipp. Falls Du nicht weiterkommst, ggf. melden.
viele Grüße
KH
Anzeige
AW: fremde Fenster aktivieren
17.06.2010 22:08:11
chris
Also würde mich schon mal über Deinen Code freuen wenn Du in hier mal einstellen könntest.
Vielen Dank und schönes Wochenende !
gruß Chris
AW: fremde Fenster aktivieren
18.06.2010 17:19:33
Ramses
Hallo
Das Beispiel sollte selbsterklärend sein
Option Explicit

'Listet alle aktiven Fenter / Applikation auf
Private Declare Function GetWindow Lib "User32" _
    (ByVal appWnd As Long, ByVal wCmd As Long) As Long

Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" _
    (ByVal appWnd As Long, ByVal wIndx As Long) As Long

Private Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" _
    (ByVal appWnd As Long) As Long

Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" _
    (ByVal appWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
    (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long



Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000


Sub Start_Test_Run()
    Dim chkName As String
    chkName = InputBox _
    ("Geben Sie den Fenstertitel ein." & Chr$(13) & _
    "ACHTUNG: Case Sensitiv !!", "Suche Application", "Excel")
        If chkName = "" Then Exit Sub
    If Check_Open_Application(chkName) = True Then
        MsgBox chkName & ": Geöffnet"
    Else
        MsgBox chkName & ": Nicht Geöffnet"
    End If
End Sub

Function Check_Open_Application(AppName As String) As Boolean
    'Test Function
    'Parameter 0: Es wird jedes Fenster explicit nach dem String überprüft
    'Parameter 1: Alle geöffneten Programme werden in einer MsgBox angezeigt.
    If GetWindowList(AppName, 0) Then
        Check_Open_Application = True
    Else
        Check_Open_Application = False
    End If
End Function


Public Function GetWindowList(findApp As String, kindMsg As Integer) As Boolean
    'Gibt True zurück wenn die Applikation aktiv ist
    Dim app() As Long
    Dim appWnd As Long, appTitle As String, appStyle As Long, appTask_name() As String
    Dim appCount As Integer, appIndex As Integer, appFound As Boolean
    Dim msgTxt As String
    appWnd = FindWindow(ByVal 0&, ByVal 0&)
    appWnd = GetWindow(appWnd, GW_HWNDFIRST)
    '1. Initialisierung
    GetWindowList = False
    Do
        'Loop starten durch alle geöffneten Fenster
        appFound = False
        appStyle = GetWindowLong(appWnd, GWL_STYLE)
        appStyle = appStyle And (WS_VISIBLE Or WS_BORDER)
        appTitle = GetWindowTitle(appWnd)
        'Alle gefundenen Applicationen in einen Array aufnehmen
        If (appStyle = (WS_VISIBLE Or WS_BORDER)) = True Then
            If Trim(appTitle) <> "" Then
                For appIndex = 1 To appCount
                    If appTask_name(appIndex) = appTitle Then
                        appFound = True
                        Exit For
                    End If
                Next appIndex
                If Not appFound Then
                    appCount = appCount + 1
                    ReDim Preserve appTask_name(1 To appCount)
                    appTask_name(appCount) = appTitle
                    ReDim Preserve app(1 To appCount)
                    app(appCount) = appWnd
                End If
            End If
        End If
        appWnd = GetWindow(appWnd, GW_HWNDNEXT)
    Loop Until appWnd = 0
    'Durchsuchen des erstellten Arrays nach der Application
    If kindMsg = 0 Then
        For appIndex = 1 To appCount
            'Es wird nur der übergebene String in "appTask_Name" gesucht
            'Die Instanz selbst wird nicht identifiziert.
            'Dazu müsste noch der String "Microsoft" geprüft werden
            If InStr(1, appTask_name(appIndex), findApp) > 1 Then
                'Application gefunden = Ende der Schleife
                GetWindowList = True
                Exit Function
            End If
        Next appIndex
        ElseIf kindMsg = 1 Then
        For appIndex = 1 To appCount
            msgTxt = msgTxt & "Aktiv: " & appTask_name(appIndex) & Chr$(13)
        Next appIndex
        MsgBox msgTxt
        GetWindowList = True
    End If
End Function

Private Function GetWindowTitle(ByVal appWnd As Long) As String
    Dim appResult As Long, appTempStr As String
    appResult = GetWindowTextLength(appWnd) + 1
    appTempStr = Space(appResult)
    appResult = GetWindowText(appWnd, appTempStr, appResult)
    GetWindowTitle = Left(appTempStr, Len(appTempStr) - 1)
End Function

Gruss Rainer
Anzeige
AW: fremde Fenster aktivieren
18.06.2010 22:11:15
chris
Boa das ist ja riesig.
Danke schau ich mir heute nicht mehr an.
gebe dann feedback !
SCHÖNES Wochenende !
gruß Chris
AW: fremde Fenster aktivieren
18.06.2010 22:54:04
chris
Hallo Rainer,
was soll der Code genau machen ?
Also ich starte die Anwendung Rechner
Starte dann das Makro und gebe in die Inputbox "Rechner" ein.
Nichts gefunden nichts passiert ?
Danke noch einmal !
gruß Chris
AW: fremde Fenster aktivieren
19.06.2010 15:18:39
Ramses
Hallo
Das passiert wenn der Suchbegriff gleich dem kompletten Windowstitel ist.
Da ich davon ausging dass du nur einen Teil des Fensterbegriffes suchst, dachte ich dass dies reicht
Ändere
If InStr(1, appTask_name(appIndex), findApp) > 1 Then
in
If InStr(1, appTask_name(appIndex), findApp) > 0 Then
Gruss Rainer
Anzeige
AW: fremde Fenster aktivieren
19.06.2010 16:10:24
chris
Jo perfekt.
Jetzt wird das Fenster gefunden !
Nur aktiviert sollte es davor noch werden.
Aber das ist ein anderes Thema :)
Danke Dir und schönes Wochenende !
hier ein Beispiel mit dem Rechner
19.06.2010 11:16:24
Tino
Hallo,
habe hier mal was aufgebaut.
Wenn der Code gestartet wird, durchläuft er eine Do … Loop Schleife bis das Fenster 'Rechner' im Vordergrund bzw.
die Zeit von 20 Sekunden abgelaufen ist (damit keine Endlosschleife entsteht).
https://www.herber.de/bbs/user/70152.xls
Das mit der Msgbox ist nur eingebaut, damit diese auch zu sehen ist wenn Excel nicht im Vordergrund ist, hat also nichts mit dem Fenster zu tun.
Gruß Tino
Anzeige
AW: hier ein Beispiel mit dem Rechner
19.06.2010 13:47:33
chris
Danke Tino.
Aber bei mir klappts nicht mit der Datei.
Habe Excel 2003 und Windows Vista.
?
Danke für die Hilfe !
was klappt nicht? oT.
19.06.2010 13:53:12
Tino
AW: was klappt nicht? oT.
19.06.2010 16:09:07
chris
Fenster wird nicht gefunden. bzw. aktiviert ?
Also Wenn ich rechner nehme wird er nicht gefunden obwohl er gestartet ist.
Danke Tino und schönen Tag noch !
lg
habe es noch mal getestet...
19.06.2010 17:03:47
Tino
Hallo,
unter WIN XP mit xl2003 und unter Win7 mit xl2007
bei beiden Versionen funktioniert es.
Vista habe ich bei mir nicht mehr am laufen.
Hast Du eventuell eine 64bit Version von Vista laufen?
So sollte es aussehen (avi Demo-Video).
https://www.herber.de/bbs/user/70154.zip
Gruß Tino
Anzeige
AW: habe es noch mal getestet...
19.06.2010 17:49:52
chris
Ja habe ich ?
Warum kann es da sein das es nicht geht Tino ?
Win API unter 64bit System
19.06.2010 18:14:24
Tino
Hallo,
ja weil viele API Funktionen für 32bit Systeme sind, es gibt zwar bestimmt immer auch eine 64bit Version, aber dies konnte ich bisher noch nie testen.
Hatte zwar mal kurz eine 64bit Version, diese habe ich aber wegen Treiberproblem schnell wieder runter geschissen.
Gruß Tino
AW: Win API unter 64bit System
19.06.2010 22:37:20
chris
Achso :(
naja muss ich dann wohl Montag mal testen wenn ich wieder normales System habe..
Danke cu schönes Wochenende !
AW: 64bit System Vista offen
19.06.2010 22:39:01
chris
Ich lass trotzdem mal offen.
Vielleicht hat jemand auch ne idee für windows Vista 64 bit
AW: geht nicht Tino
21.06.2010 06:54:06
chris
Hallo Tino,
geht aber bei mir auf Arbeit auch nicht ?
Könntest Du noch einmal testen ?
Weil auf Arbeit habe ich ja daas gleiche system wie Du auch :)
gruß Chris
Anzeige
habe es noch mal getestet...
21.06.2010 07:47:04
Tino
Hallo,
sobald der Rechner in den Vordergrund kommt geht die Msgbox auf.
Hier noch eine Version mit einem anderen Timer.
https://www.herber.de/bbs/user/70171.xls
Kommt der Rechner in den Vordergrund, kommt die Meldung:
"'Rechner' ist im Vordergrund"
Wird nach 5 Sekunden wieder ausgeblendet
Wenn der Rechner gestartet ist aber in der Taskleiste oder im Hintergrund liegt,
kommt nach ca. 20 Sekunden die Meldung:
"'Rechner' Fenster wurde gefunden, ist nicht im Vordergrund"
Wurde der Rechner nicht gefunden, kommt nach ca. 20 Sekunden die Meldung:
"'Rechner' Fenster wurde nicht gefunden"
Gruß Tino
Anzeige
AW: habe es noch mal getestet...
21.06.2010 19:05:43
chris
Cool Danke.
hab ich gerade erst gelesen Die Antwort von dir !

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige