Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0214: Fenster in den Vordergrund bringen

 von 

Beschreibung 

Hiermit läßt sich ein Fenster beliebiger Wahl in den Vordergrund bringen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

BringWindowToTop, FindWindowA (FindWindow), GetWindowPlacement, SetForegroundWindow, SetWindowPlacement

Download:

Download des Beispielprojektes [2,21 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"

Option Explicit

Private Declare Function FindWindow Lib "user32" _
        Alias "FindWindowA" (ByVal lpClassName _
        As String, ByVal lpWindowName As String) _
        As Long
        
Private Declare Function GetWindowPlacement Lib _
        "user32" (ByVal hwnd As Long, lpwndpl As _
        WINDOWPLACEMENT) As Long
        
Private Declare Function SetWindowPlacement Lib _
        "user32" (ByVal hwnd As Long, lpwndpl _
        As WINDOWPLACEMENT) As Long
        
Private Declare Function SetForegroundWindow Lib _
        "user32" (ByVal hwnd As Long) As Long
        
Private Declare Function BringWindowToTop Lib _
        "user32" (ByVal hwnd As Long) As Long

Const SW_SHOWNORMAL = 1
Const SW_SHOWMINIMIZED = 2

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Type WINDOWPLACEMENT
  Length As Long
  flags As Long
  showCmd As Long
  ptMinPosition As POINTAPI
  ptMaxPosition As POINTAPI
  rcNormalPosition As RECT
End Type

Private Sub Form_Load()
  Shell ("notepad.exe")
End Sub

Private Sub Command1_Click()
  Dim xhWnd&
   
    xhWnd = FindWindow(vbNullString, "Unbenannt - Editor")
    Me.Caption = ActivateWindow(xhWnd)
End Sub

Private Function ActivateWindow(xhWnd&) As Boolean
  Dim Result&, WndPlcmt As WINDOWPLACEMENT
 
    With WndPlcmt
      .Length = Len(WndPlcmt)
      Result = GetWindowPlacement(xhWnd, WndPlcmt)
      If Result Then
        If .showCmd = SW_SHOWMINIMIZED Then
          .flags = 0
          .showCmd = SW_SHOWNORMAL
          Result = SetWindowPlacement(xhWnd, WndPlcmt)
        Else
          Call SetForegroundWindow(xhWnd)
          Result = BringWindowToTop(xhWnd)
        End If
        If Result Then ActivateWindow = True
      End If
    End With
  End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 11 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Sh33p am 15.08.2007 um 11:43

@Thereza

wenn ich das aus deinen codeschnipsel richtig entnehme, muss damit es funktioniert die caption der form die du in den vordergrund bringen willst "bildschirmfarben.frm" sein. sollte dies nicht der fall sein, funktioniert es auch nicht.

Kommentar von Thereza Weicht am 15.08.2007 um 02:59

hat bei mir auf Win98 mit Notepad einigermassen funktioniert, aber nicht bei einer Visal Basic-Form (VB 4.0). Die wird immer überdeckt, immer sobald ich auf ein anderes Fenster clicke!

Codeabschnitt:

Private Sub Form_Load()

Dim xhWnd&
Do
xhWnd = FindWindow(vbNullString, "bildschirmfarben.frm")
'xhWnd = FindWindow(vbNullString, "Unbenannt - Editor")
b = ActivateWindow(xhWnd)

DoEvents
Loop

End Sub

Kommentar von Sh33p am 23.11.2005 um 19:31

für die leute die sagen das sie meist nur den prozessnamen kennen etc. es gibt ne möglichkeit sich den fenstertitel eines prozesses auszulesen.

kenne aber momentan nur die moeglichkeit dies zu tun wenn man den prozess selber startet.

hier mal n code beispiel:

' benötigte API-Deklarationen
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
ByVal hwnd As Long, _
lpdwProcessId As Long) As Long

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

Private Declare Function GetWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal wCmd As Long) As Long

Private Declare Function GetParent Lib "user32" ( _
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 Const GW_HWNDNEXT = 2


' Ermittelt das Fensterhandle anhand einer Prozess-ID
Private Function ProcID2hWnd(ByVal ProcID As Long) As Long
' alle Fenster durchlaufen und nach Process-ID suchen
Dim lngHWnd As Long
Dim lngProcTaskID As Long

lngHWnd = FindWindow(vbNullString, vbNullString)
Do While lngHWnd <> 0

' Existiert kein Eltern-Fenster, dann ProcssID
' ermitteln und vergleichen
If GetParent(lngHWnd) = 0 Then
GetWindowThreadProcessId lngHWnd, lngProcTaskID

' Handelt es sich um den gesuchten Prozess?
If lngProcTaskID = ProcID Then
' Fenster-Handle zurückgeben und Schleife
' verlassen!
ProcID2hWnd = lngHWnd
Exit Do
End If

End If

' Nächstes Fenster
lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT)
Loop
End Function


Beispielaufruf:

Dim nHWnd As Long
Dim sTitle As String
Dim nResult As Long
Dim nProcessID As Long

' Notepad starten
nProcessID = Shell("notepad.exe")

' Fensterhandle anhand ProcessID ermitteln
nHWnd = ProcID2hWnd(nProcessID)
If nHWnd <> 0 Then
' und jetzt den Fenstertitel auslesen
sTitle = Space$(255)
nResult = GetWindowText(nHWnd, sTitle, Len(sTitle))
If nResult > 0 Then
sTitle = Left$(sTitle, nResult)
MsgBox sTitle
End If
End If


hoffe es hilft dem einen oder anderen

mfg Sh33p

Kommentar von Alex am 05.10.2005 um 10:57

Wie binrge ich ein Fenster so in den Fordergrund, das es auch bei einem gesperrten Desktop angezeigt wird ?

Kommentar von Phasenverschiebung am 01.07.2005 um 09:46

Ähnliches Problem wie Michael Wolf:
Ich kenne den exe-Namen, und will damit mein Programm in den Vordergrund bringen, also den gleichen Effekt, wie ein Click auf die Task-Leiste.
wie geht so was?

Gruß P.

Kommentar von Joe am 23.10.2003 um 15:28

Geht nicht mit einer DOS-Vollbild-Console.
DOS-Console als Window funktioniert !

Warum ?
Gibts eine Lösung ?

Danke Joe

Kommentar von Mabuse am 09.05.2003 um 09:53

Bei mir funktioniert das nicht... :(

Ich nutze Tipp 0007, setzte das Fenster auf TOpMOST und sofort wieder auf NOTOPMOST, dann geht es.

Kommentar von Raller am 17.10.2001 um 11:32

Leider funktioniert das ja nur, wenn man GENAU die Titelleiste des Fensters kennt. Manchmal kenne ich nur das Programm oder den Dateinamen.
Wie kann man nach Teilen der Titelleiste suchen?
please help, ich suche schon lange.

Kommentar von Michael Wolf am 07.10.2001 um 08:07

Wie schafft man es, dass wenn sich eine Msgbox öffnet, die Form in den Vordergrung kommt?

Kommentar von Sky567804007295 am 29.06.2001 um 18:54

Hallo ,
kann mir jemand sagen wich ich auch ein Fenster das sich in einem einem Midi-Fenster ( Midi-Formular ) befindet mache ?
schon mal danke , sky

Kommentar von nobody am 01.06.2001 um 17:18

SetForegroundWindow funktioniert nicht mehr unter Win2k.