VB 5/6-Tipp 0214: Fenster in den Vordergrund bringen
von ActiveVB
Beschreibung
Hiermit läßt sich ein Fenster beliebiger Wahl in den Vordergrund bringen.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: BringWindowToTop, FindWindowA (FindWindow), GetWindowPlacement, SetForegroundWindow, SetWindowPlacement | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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.