Programm wechseln oder öffnen

  • VB.NET

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

    Programm wechseln oder öffnen

    Hallo Zusammen,

    ich öffne mit folgendem Code den Windowstaschenrechner per Button-klick.

    VB.NET-Quellcode

    1. Private Sub TaschenrechnerButton_Click(sender As System.Object, e As System.EventArgs) Handles TaschenrechnerButton.Click
    2. System.Diagnostics.Process.Start(My.Settings.Taschenrechner)
    3. End Sub


    Funktioniert super. Wenn man jedoch öfters auf den Button klickt, wird der Taschenrechner jedesmal neu gestartet. Ich möchte gerne, wenn der Taschenrechner bereits geöffnet wurde und in der Windowsleiste unten bereits geöffnet ist, dass der Taschenrechner nicht nochmal neu gestartet wird, sondern nur zum Taschenrechner gewechselt wird.

    Kurz gesagt, Ist der Taschenrechner noch nicht geöffnet, dann soll er geöffnet werden, ist er bereits geöffnet, dann sollte nur gewechselt werden.

    Ist das möglich?
    visual-basic5.de/vbclassic/dotnet/runproce.htm

    Da gibt es zB. die Fkt.

    VB.NET-Quellcode

    1. Public Sub GetAllRunningProcess(ByRef lb As ListBox)
    2. Try
    3. Dim hProcess() As Process = Process.GetProcesses()
    4. If hProcess.Length > 0 Then
    5. Dim hCount As Integer
    6. For hCount = 0 To hProcess.Length - 1
    7. With lb
    8. .Items.Add(hProcess(hCount).ProcessName)
    9. End With
    10. Next
    11. End If
    12. Catch ex As Exception
    13. MessageBox.Show(ex.Message)
    14. End Try
    15. End Sub


    Die listet alle Prozessnamen.

    Ansonsten => GIDF
    Wie wäre sowas....

    VB.NET-Quellcode

    1. Private Sub bCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bCalc.Click
    2. Dim Resultat As String = DoesProcessExists("calc")
    3. If Resultat = False Then
    4. Process.Start("C:\Windows\System32\calc.exe")
    5. End If
    6. End Sub


    VB.NET-Quellcode

    1. Private Function DoesProcessExists(ByVal PName As String) As Boolean
    2. If System.Diagnostics.Process.GetProcessesByName(PName).Length >= 1 Then
    3. Return True
    4. End If
    5. Return False
    6. End Function
    7. End Class
    Sieht gut aus.
    Der Calc wird zwar dadruch kein zweites mal geöffnet, aber wenn der Calc einmal geöffnet wurde, dann das Fenster gewechsel wurde und anschließend klickt man dann nochmal auf den Button Calc, dann sollte er eigentlich zu dem bereits geöffneten calc wechseln. Das macht er leider nicht. Wenn der Calc bereits geöffnet ist und es wird nochmal auf den Button geklickt, dann passiert gar nichts. Es sollte aber wie bereits gesagt dann zum Calc wechseln.
    Das sollte funktionieren...

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Resultat As String = DoesProgrammExist("calc")
    3. If Resultat = False Then
    4. Process.Start("C:\windows\System32\calc.exe")
    5. Else
    6. ShowWindow(FindWindow(Nothing, "Rechner"), SW_RESTORE)
    7. AppActivate("Rechner")
    8. End If
    9. End Sub

    VB.NET-Quellcode

    1. Private Function DoesProgrammExist(ByVal PName As String) As Boolean
    2. If System.Diagnostics.Process.GetProcessesByName(PName).Length >= 1 Then
    3. Return True
    4. Else
    5. Return False
    6. End If
    7. End Function


    VB.NET-Quellcode

    1. Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    2. Declare Function ShowWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal nCmdShow As Int32) As Boolean
    3. Const SW_RESTORE As Int32 = 9
    Vielen Dank für eure Hilfe, funktioniert aber leider auch nicht bei mir, weil ich mit Option Strict ON arbeite und mit den Code von bk__ erhalte ich immer Fehler wegen Option Strict ON

    Ich habe den Code mal ein wenig abgeändert, so dass keine Fehlermeldungen mehr kommen, aber leider funktioniert er so nicht wie gewünscht.

    VB.NET-Quellcode

    1. Private Sub TaschenrechnerButton_Click(sender As System.Object, e As System.EventArgs) Handles TaschenrechnerButton.Click
    2. 'System.Diagnostics.Process.Start(My.Settings.Taschenrechner)
    3. Dim Resultat As String = CStr(DoesProgrammExist("calc"))
    4. If CBool(Resultat) = False Then
    5. Process.Start("C:\windows\System32\calc.exe")
    6. Else
    7. ShowWindow(FindWindow(Nothing, "Rechner"), SW_RESTORE)
    8. AppActivate("Rechner")
    9. End If
    10. End Sub
    11. Private Function DoesProgrammExist(ByVal PName As String) As Boolean
    12. If System.Diagnostics.Process.GetProcessesByName(PName).Length >= 1 Then
    13. Return True
    14. Else
    15. Return False
    16. End If
    17. End Function
    18. Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    19. Declare Function ShowWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal nCmdShow As Int32) As Boolean
    20. Const SW_RESTORE As Int32 = 9
    @bk__: Warum deklarierst Du Resultat als String, wenn Deine Funktion einen Boolean zurückgibt.
    Und @toeller: Warum ist Dir das nicht gleich aufgefallen?

    Schau mal:

    VB.NET-Quellcode

    1. <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    2. Public Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As UInteger) As Boolean
    3. End Function
    4. Enum uFlags As UInteger
    5. SWP_NOMOVE = &H2
    6. SWP_NOSIZE = &H1
    7. SWP_SHOWWINDOW = &H40
    8. End Enum
    9. Enum hWndInsertAfter As Integer
    10. BehindTopMost = -2
    11. End Enum
    12. Sub Foo()
    13. Dim Calcs = Process.GetProcessesByName("calc")
    14. If Calcs.Count = 0 Then
    15. Process.Start("")
    16. Else
    17. 'Es können auch mehrere bereits offen sein. Was dann passiert musst Du entscheiden. Hier wird nur der erste, der gefunden wurde, in den Vordergrund geholt.
    18. SetWindowPos(Calcs.First.MainWindowHandle, New IntPtr(hWndInsertAfter.BehindTopMost), -1, -1, -1, -1, uFlags.SWP_NOMOVE Or uFlags.SWP_NOSIZE Or uFlags.SWP_SHOWWINDOW)
    19. End If
    20. End Sub


    Ich weiß nicht, ob das die Microsoft.VisualBasic.dll eine Wrapper-Funktion bereithält, um ein Fenster in den Vordergrund zu holen, aber das ist die bisher sauberste Lösung, die ich kenne.
    Ich habe die unnötigen Enum-Werte mal weggelassen. Die restlichen findest Du bei MSDN.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils