Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Fenster aktivieren Appactivate oder anders

Fenster aktivieren Appactivate oder anders
05.05.2009 12:09:02
chris
Hallo Forumsbesucher und Excelexperten,
ich habe eine frage und würde mich sehr über Hilfe freuen.
Ich habe momentan vor über Excel ein fenster in den Vordergrund zu holen.
Das schaffe ich auch mit einem Makro...
Was ich nicht schaffe ist es das Fenster zu aktivieren so das der Cursor in dem Programm blinkt.
habe es MIt AppActivate ("fenstername) versucht aber es kommt immer ein fehler.
Obwohl ich genau den richtigen Fensternamen eingebe:(
Es handelt sich in dem Fall um ein SAP Fenster.
Bei vielen anderen geht es aber bei diesem nicht.
Auch wenn ich mit dem anderen Programm das fenster in den Vordergrund hole hat das fenster z.b den Namen "sap_fenstername" aber mit AppActivate gehts nicht :(
Um das fenster in den Vordergrund zu holen verwende ich so einen Code.
Hier ein teil davon.
Declare

Function GetWindow Lib "User32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Declare 

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

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

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

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

Function SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X  _
As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long


Sub vordergrund()
cb = Cells(1, 1)
whandle = FindWindow(vbNullString, cb)
Call SetWindowPos(whandle, -1, 0, 0, 0, 0, 3)
'bis hier hin funktioniert es.
Sobald abeer AppActivate das fenster aktivieren soll kommt der Fehler.
AppActivate (cb)
End Sub


Würde mich sehr über Hilfe freuen.
Vielleicht weiß jemand eine möglichkeit über API ein fenster zu aktivieren.
Vielen Dank dafür im vorraus
gruß Christian

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fenster aktivieren Appactivate oder anders
05.05.2009 12:21:23
Tino
Hallo,
hier mal ein Beispiel für den Internetexplorer.
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

Const iNormal& = 1
Const iMinimized& = 2
Const iMaximized& = 3

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


Sub Maximieren_Internet_Explorer()
Dim hwnd As Long
Dim STitel As String

STitel = "Internet Explorer" 'hier einen Teil vom Titel angeben 

  hwnd = GetDesktopWindow()
  hwnd = GetWindow(hwnd, GW_CHILD)
  
  '2. Param. Fenstertitel (nur ein Teil erforderlich) 
  '3. Param. optional True nur Sichtbare, False alle 
  GetWindowInfo hwnd, "Internet Explorer", True

Do While hwnd <> 0
    hwnd = GetWindow(hwnd, GW_HWNDNEXT)
   If GetWindowInfo(hwnd, STitel, True) = hwnd Then
    ShowWindow hwnd, iMaximized 'maximieren 
    SetForegroundWindow hwnd 'aktivieren 
   End If
Loop

End Sub


Gruß Tino

Anzeige
AW: Fenster aktivieren Appactivate oder anders
05.05.2009 12:37:55
Tino
Hallo,
war mal für was anderes gedacht, habe es nur erweitert.
die Zeile muss noch angepasst werden
mach aus
GetWindowInfo hwnd, "Internet Explorer", True
diese
GetWindowInfo hwnd, STitel, True
Gruß Tino
AW: Fenster aktivieren Appactivate oder anders
05.05.2009 13:44:22
chris
Perfekt.
Ist ja total super !
Danke Dir und schönen tag wünsche ich !!!
gruß Chris
Anzeige
AW: zusatzfrage
05.05.2009 14:36:37
chris
Hallo tino,
dein Code hat mir schon super weiter geholfen.
Jetzt aber eine frage vielleicht hast du da auch noch eine Idee ?
hier ist ein teil deines Codes.
Wenn das zu aktivierende fenster nicht gestartet ist beendet dein Makro einfach.
Gibt es eine möglichkeit zu sagen das dein Programm ich sag einfach einmal 20sekunden warten soll und immer wieder prüfen soll ob das fenster geöffnet wird und wenn nicht solll es abbruchen bevor es weiter macht. ?
Geht das ?
Do While hwnd 0
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
If GetWindowInfo(hwnd, STitel, True) = hwnd Then
'ShowWindow hwnd, iMaximized 'maximieren
SetForegroundWindow hwnd 'aktivieren
End If
Loop
'hier erst weiter machen wenn Fenster !!erfolgreich!! aktiviert wurde
call neues_makro
Würde mich freuen wenn Du oder jemand anderes mir noch einmal helfen könntest.
Vielen Dank
Anzeige
bin auf der arbeit, erst heute Abend. oT.
05.05.2009 15:24:30
Tino
AW: bin auf der arbeit, erst heute Abend. oT.
05.05.2009 16:37:42
chris
Wäre super.
Vielen Dank Tino !
teste mal
05.05.2009 23:16:18
Tino
Hallo,
ok. habe mal was zusammengebastelt. (siehe Sub Beispiel())
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

Const iNormal& = 1
Const iMinimized& = 2
Const iMaximized& = 3

Dim booAktiv As Boolean

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


Sub ActiviereAnwendung(STitel As String, WarteZeitSek As Integer, Optional i As Integer = 0)
Dim hwnd As Long

  hwnd = GetDesktopWindow()
  hwnd = GetWindow(hwnd, GW_CHILD)
  
  '2. Param. Fenstertitel (nur ein Teil erforderlich) 
  '3. Param. optional True nur Sichtbare, False alle 
    GetWindowInfo hwnd, STitel, True

    Do While hwnd <> 0
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
       If GetWindowInfo(hwnd, STitel, True) = hwnd Then
        ShowWindow hwnd, iMaximized 'maximieren 
        SetForegroundWindow hwnd 'aktivieren 
        booAktiv = (hwnd > 0)
        If booAktiv Then Exit Do
       End If
    Loop
  
    If (i < WarteZeitSek - 1) And Not booAktiv Then
     DoEvents
     Application.Wait Now + TimeSerial(0, 0, 1)
     i = i + 1
     ActiviereAnwendung STitel, WarteZeitSek, i
    End If


End Sub

Sub Beispiel()
 booAktiv = False
 
 '1. Param Programmtitel, 2. Param Wartezeit in Sekunden 
 ActiviereAnwendung "Internet Explorer", 20
 
 If Not booAktiv Then
  MsgBox "Anwendung nicht gefunden!", vbCritical
  Exit Sub
 End If

End Sub


Gruß Tino

Anzeige
AW: teste mal
06.05.2009 07:32:11
chris
Super,Klasse,Perfekt.
Vielen vielen Dank Tino !!!!!!!!!!!!!!!!!!!!!!!!
Schönen Tag wünsche ich Dir !
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Fenster aktivieren mit VBA: AppActivate und alternative Methoden


Schritt-für-Schritt-Anleitung

Um ein Fenster mit VBA in den Vordergrund zu holen und zu aktivieren, kannst du die folgenden Schritte befolgen:

  1. VBA-Editor öffnen: Drücke ALT + F11 in Excel.

  2. Neues Modul hinzufügen: Klicke mit der rechten Maustaste auf VBAProject (dein Arbeitsblatt) > Einfügen > Modul.

  3. Code einfügen: Füge den folgenden Code in das Modul ein:

    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    
    Sub BringWindowToFront()
       Dim hwnd As Long
       hwnd = FindWindow(vbNullString, "Fenstertitel hier eingeben")
       If hwnd <> 0 Then
           SetForegroundWindow hwnd
       Else
           MsgBox "Fenster nicht gefunden"
       End If
    End Sub
  4. Fenstertitel anpassen: Ersetze "Fenstertitel hier eingeben" mit dem tatsächlichen Titel des Fensters, das du aktivieren möchtest.

  5. Makro ausführen: Starte das Makro BringWindowToFront, um das Fenster in den Vordergrund zu holen.


Häufige Fehler und Lösungen

  • Fehler bei AppActivate: Wenn AppActivate nicht funktioniert, liegt es möglicherweise daran, dass der Fenstertitel nicht exakt übereinstimmt. Achte darauf, den vollständigen und korrekten Titel zu verwenden.

  • Window nicht gefunden: Wenn das Fenster nicht gefunden wird, überprüfe, ob es wirklich geöffnet ist. Du kannst den Titel auch mit der Funktion GetWindowInfo ermitteln, um den richtigen Titel zu erhalten.


Alternative Methoden

Wenn AppActivate nicht funktioniert, kannst du die Windows API verwenden:

  1. SetForegroundWindow: Diese Funktion kann verwendet werden, um ein Fenster in den Vordergrund zu bringen, ohne den Fokus zu verlieren.

    Beispiel:

    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  2. Warten auf das Fenster: Du kannst auch eine Funktion erstellen, die wartet, bis das Fenster verfügbar ist. Hier ein Beispiel:

    Sub WaitForWindow(STitel As String, Wartezeit As Integer)
       Dim hwnd As Long
       Dim i As Integer
       For i = 1 To Wartezeit
           hwnd = FindWindow(vbNullString, STitel)
           If hwnd <> 0 Then
               SetForegroundWindow hwnd
               Exit Sub
           End If
           Application.Wait Now + TimeValue("00:00:01")
       Next i
       MsgBox "Fenster nicht gefunden!"
    End Sub

Praktische Beispiele

  1. Fenster aktivieren: Um ein SAP-Fenster zu aktivieren, könnte dein Code so aussehen:

    Sub ActivateSAP()
       Call WaitForWindow("SAP-Fenstertitel", 20)
    End Sub
  2. Internet Explorer maximieren: Ein Beispiel, um den Internet Explorer zu maximieren:

    Sub MaximierenIE()
       Dim hwnd As Long
       hwnd = FindWindow(vbNullString, "Internet Explorer")
       If hwnd <> 0 Then
           ShowWindow hwnd, 3 ' 3 bedeutet maximieren
           SetForegroundWindow hwnd
       End If
    End Sub

Tipps für Profis

  • Verwendung von GetWindowInfo: Diese Funktion kann dir helfen, den Titel des Fensters zu bestimmen. Es ist besonders nützlich, wenn du nur einen Teil des Fenstertitels kennst.

  • Error Handling: Füge Fehlerbehandlungsroutinen hinzu, um sicherzustellen, dass dein Makro stabil läuft, auch wenn das Fenster nicht gefunden wird.


FAQ: Häufige Fragen

1. Funktioniert dieses Verfahren in allen Excel-Versionen?
Ja, die beschriebenen Methoden sollten in allen modernen Excel-Versionen funktionieren, die VBA unterstützen.

2. Was ist der Unterschied zwischen AppActivate und SetForegroundWindow?
AppActivate versucht, ein Programm zu aktivieren, basierend auf dem Titel, während SetForegroundWindow direkt ein Fenster basierend auf der Fensterhandle-Nummer in den Vordergrund bringt.

3. Wie kann ich überprüfen, ob ein Fenster geöffnet ist?
Verwende die FindWindow-Funktion, um die Fensterhandle zu ermitteln. Wenn die Rückgabe 0 ist, ist das Fenster nicht geöffnet.

4. Gibt es eine Möglichkeit, den Fensterfokus zu erzwingen?
Ja, du kannst SetForegroundWindow verwenden, um sicherzustellen, dass das Fenster den Fokus erhält, jedoch kann dies je nach Benutzeroberfläche eingeschränkt sein.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige