Visual Basic zwischen Fenstern wechseln

... komplette Frage anzeigen

1 Antwort

Ich hatte dir eine lange und ausführliche Antwort geschrieben. Dieses unzulängliche, alles andere als ausgereifte Forum hat die Antwort aber nicht zugelassen. Sie enthielt die Deklaration einer API-Funktion, die das Forum doch tatsächlich als URL interpretierte und die sei nicht zugelassen. So etwas bescheuertes!

Also bleibt mir nichts anderes übrig, es dir in Worten anstatt über Code zu verdeutlichen. Ganz umsonst soll der Aufwand nun auch nicht gewesen sein. Oder, mal sehen, vielleicht wird die Antwort in anderer Form angenommen...

Deklariere die folgenden API-Funktionen im oberen Bereich deiner Klasse (z.B. Form):

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

Als nächstes kannst du diese Funktionen wie folgt anwenden:

Dim hdl As IntPtr = FindWindow("Notepad", "Untitled - Notepad")

If hdl = IntPtr.Zero Then
  MsgBox("Window not found!")
  Return
End If

SetForegroundWindow(hdl)

Die Fenster-Angaben in FindWindow musst du natürlich nach deinen Bedürfnissen anpassen. Ich hoffe, dir damit geholfen zu haben. Sonst waren beide Aufwände umsonst. ;-)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Toraka
08.12.2013, 16:57

Übrigens ist es nicht notwendig, den zweiten Parameter für FindWindow zu belegen, du kannst die Funktion auch wie folgt aufrufen, was bei mir unter C# ausgezeichnet funktioniert:

FindWindow("Notepad", null);

Problematisch wird es aber, ist das entsprechende Fenster minimiert. Hier funktioniert es leider nicht. Aber auch hierzu gibt es Lösungsmöglichkeiten. Gegebenenfalls schreibe ich dir noch etwas dazu.

1
Kommentar von Toraka
08.12.2013, 17:14

Ist das Fenster als Icon minimiert, kannst du es wie folgt in den Vordergrund holen, wobei der folgende Code in sich eigenständig ist, also unabhängig des bereits obig aufgeführten Codes.

Private Declare Function SetForegroundWindow Lib "user32" _ 
  (ByVal hwnd As Long) As IntPtr
Private Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Auto Function IsIconic Lib "user32" _
  Alias "IsIconic" (ByVal hwnd As IntPtr) As Int32
Private Declare Auto Function OpenIcon Lib "user32" _
  Alias "OpenIcon" (ByVal hwnd As IntPtr) As Int32

Die API-Funktionen wendest du wie folgt an:

'Nothing entpspricht in etwa der Angabe null in C#
Dim hdl As IntPtr = FindWindow("Notepad", Nothing) 

If hdl = IntPtr.Zero Then
  MsgBox("Window not found!")
  Return
End If

if IsIconic(hdl)
  OpenIcon(hdl)
Else
  SetForegroundWindow(hdl)
EndIf

Weitere Informationen, auch, wie das Handle über Process abgefragt werden kann, findest du hier: http://msdn.microsoft.com/de-de/library/bb979551.aspx

1

Was möchtest Du wissen?