Minimieren und Maximieren externer Fenster/Anwendungen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Louis.Cyfer.

    Minimieren und Maximieren externer Fenster/Anwendungen

    Hallo alle zusammen,

    habe ein kleines Problem mit einer, wie ich denke, sehr simplen Sache:

    Ich möchte mit meinem Programm ein externes Fenster Mini- bzw. Maximieren.

    Habe schon selber probiert, aber das klappt auf jeden Fall nicht:

    VB.NET-Quellcode

    1. Private Declare Function FindWindow Lib "user32" _
    2. Alias "FindWindowA" ( _
    3. ByVal lpClassName As String, _
    4. ByVal lpWindowName As String) As Long
    5. Private Declare Function ShowWindow Lib "user32" ( _
    6. ByVal hWnd As Long, _
    7. ByVal nCmdShow As Long) As Long
    8. Dim lhWnd As Long
    9. Dim sTitle As String
    10. sTitle = "Exakter Fenstertitel"
    11. lhWnd = FindWindow(vbNullString, sTitle)
    12. ShowWindow lhWnd, vbMinimizedNoFocus




    Soweit so gut: Habe dann als "Exakter Fenstertitel" z. B. "Unbenannt - Editor" für einen ganz normal geöffneten Editor genommen. In der Form habe ich ich den nen Button eingefügt, der die Funktion ausführen soll. Aber es passiert nichts...

    Kann mir jemand sagen wieso? Oder hier einfach einen code reinposten, mit dem das Ganze funktioniert?

    Danke schonmal im Vorraus :thumbsup:



    EDIT: Natürlich habe ich unten statt vbMinimizedNoFocus schon anderes eingesetz, wie:
    vbHide
    vbMaximizedFocus
    vbMinimizedFocus
    vbNormalFocus
    vbNormalNoFocus
    hallo peri,

    die apis hast du wie in vb6 deklariert.
    unter vb.net gelten diese deklarationen so nicht mehr.

    desweiteren brauchst du findwindow nicht mehr.
    verwende die prozess-klasse.

    eine gültige showwindow deklaration findest du z.b. auf meiner hp

    gruss

    mikeb69
    Erstmal: Vielen Dank!

    Du hast mich, denke ich, schon einen Schritt weiter gebracht.

    Habe jetzt das ganze eingefügt, was dann so aussieht:

    VB.NET-Quellcode

    1. Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As Int32) As Int32
    2. Public Const SW_HIDE As Int32 = 0 'Versteckt das Fenster
    3. Public Const SW_MAXIMIZE As Int32 = 3 'Maximiert das Fenster
    4. Public Const SW_MINIMIZE As Int32 = 6 'Minmiert das Fenster
    5. Public Const SW_NORMAL As Int32 = 1 'Aktiviert das Fenster
    6. Public Const SW_RESTORE As Int32 = 9 'Stellt das Fenster wieder her
    7. Public Const SW_SHOW As Int32 = 5 'Zeigt das Fenster an, auch wenn es versteckt ist
    8. Public Const SW_SHOWMAXIMIZED As Int32 = 3 'Zeigt das Fenster an und Maximiert es
    9. Public Const SW_SHOWMINIMIZED As Int32 = 2 'Zeigt das Fenster an und Minimiert es
    10. Public Const SW_SHOWMINNOACTIVE As Int32 = 7 'Minimiert das Fenster aber aktiviert es nicht
    11. Public Const SW_SHOWNA As Int32 = 8 'Zeigt das Fenster an aber aktiviert es nicht
    12. Public Const SW_SHOWNOACTIVATE As Int32 = 4 'Zeigt das Fenster an ohne es zu aktivieren
    13. Public Const SW_SHOWNORMAL As Int32 = 1 'Zeigt das Fenster und aktiviert dies


    Mache ich jetzt als Button diese Funktion:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. ShowWindow("Rechner", SW_SHOWMAXIMIZED)
    3. End Sub

    Dann sagt er mir "InvalidCastExpection wurde nicht behandelt.
    Ungültige Konvertierung von der Zeichenfolge Rechner in Typ Long."
    Kann ich da vielleicht nicht einfach "Rechner" angeben oder was ist da falsch?
    Gesagt sei: Ich bin noch Anfänger, und habe noch nicht einen so ausgeprägten Blick, also sry wenn
    meine Frage etwas blöd ausfallen :D
    Viele Dank für alle Antworten schonmal im Vorraus
    mfg Peri
    hallo peri,

    für diese api benötigst du das fensterhandle deiner anwendung ("Rechner").
    so könnte dein code aussehen.

    VB.NET-Quellcode

    1. Dim p() As Process = Process.GetProcessesByName("Rechner")
    2. ShowWindow(p(0).MainWindowHandle, SW_SHOWMAXIMIZED)

    gruss

    mikeb69
    Nochmal Danke mike. Hab schon das nächste Problem.

    Habe überlegt, aber kann mir dadrauf einfach keinen Reim machen ^^

    VB.NET-Quellcode

    1. Dim p() As Process = Process.GetProcessesByName("Rechner")
    2. ShowWindow(p(0).MainWindowHandle, SW_SHOWMAXIMIZED)

    Habe das hier jetzt als Befehl genommen.
    Beim Ausführen per Button sagt er mir dann "IndexOutOfRangeExeption wurde nicht behandelt.
    Der Index war außerhalb des Arraybereichs."
    Bitte um erneute Antwort.
    Danke wie immer im Vorraus.
    mfg Peri
    Ich versteh nicht wie ich das aufbauen soll... Bei mir kommt immer irgend ein Fehler... Entweder "Mit dem Remotecomputer konnte keine Verbindung hergestellt werden." oder der sagt mir dass der Wert aus einem mit unbekannten Grund nicht stimmen kann.

    Wenn ich den Rechner starte hat er den Prozess "calc.exe", das Fenster heißt einfach nur "Rechner". Wie sähe denn dann der "Maximierenbefehl" aus, wenn ich den selber auf die Taskleiste minimiere?

    So ja anscheinend nicht:

    VB.NET-Quellcode

    1. Dim p() As Process = Process.GetProcessesByName("calc.exe", "Rechner")
    2. ShowWindow(p(0).MainWindowHandle, SW_SHOWMAXIMIZED)

    Wenn du mir nochmal helfen könntest, wäre ich dir sehr dankbar.
    mfg Peri
    ich hoffe das ist nicht zu spät :(

    versuchs mal so:

    VB.NET-Quellcode

    1. Dim Processes As Process() = Process.GetProcesses()
    2. For Each proc As Process In Processes
    3. If proc.ProcessName.Contains("java") Then
    4. ShowWindow(WindowTitle, SW_NORMAL)
    5. End If
    6. Next
    MfG Cyfer
    ---
    Dim Louis.Cyfer As Coder.Object
    Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
    Application.DoEvents()
    Loop
    ' Der Beste Code ist immer noch der eigene
    ---
    sammelst auch posts, wa?

    ich habs jetz so gemacht (weil das vorhergehende is das auch nicht komplett):

    mit der entsprechenden API deklaration (noch form1.load!!!):

    VB.NET-Quellcode

    1. Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As Int32) As Int32
    2. Public Const SW_HIDE As Int32 = 0 'Versteckt das Fenster
    3. Public Const SW_MAXIMIZE As Int32 = 3 'Maximiert das Fenster
    4. Public Const SW_MINIMIZE As Int32 = 6 'Minmiert das Fenster
    5. Public Const SW_NORMAL As Int32 = 1 'Aktiviert das Fenster
    6. Public Const SW_RESTORE As Int32 = 9 'Stellt das Fenster wieder her
    7. Public Const SW_SHOW As Int32 = 5 'Zeigt das Fenster an, auch wenn es versteckt ist
    8. Public Const SW_SHOWMAXIMIZED As Int32 = 3 'Zeigt das Fenster an und Maximiert es
    9. Public Const SW_SHOWMINIMIZED As Int32 = 2 'Zeigt das Fenster an und Minimiert es
    10. Public Const SW_SHOWMINNOACTIVE As Int32 = 7 'Minimiert das Fenster aber aktiviert es nicht
    11. Public Const SW_SHOWNA As Int32 = 8 'Zeigt das Fenster an aber aktiviert es nicht
    12. Public Const SW_SHOWNOACTIVATE As Int32 = 4 'Zeigt das Fenster an ohne es zu aktivieren
    13. Public Const SW_SHOWNORMAL As Int32 = 1 'Zeigt das Fenster und aktiviert dies


    funktion (button oder so):

    VB.NET-Quellcode

    1. Dim Processes As Process() = Process.GetProcesses()
    2. For Each proc As Process In Processes
    3. If proc.ProcessName = "javaw" And proc.MainWindowTitle = WindowTitle Then
    4. ShowWindow(proc.MainWindowHandle, SW_SHOWMAXIMIZED)
    5. End If
    6. Next
    MfG Cyfer
    ---
    Dim Louis.Cyfer As Coder.Object
    Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
    Application.DoEvents()
    Loop
    ' Der Beste Code ist immer noch der eigene
    ---

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Louis.Cyfer“ ()