Member 9389588 Ответов: 1

[Vb.net] как переключаться между внешними приложениями


- Привет! Я пытаюсь написать приложение, которое может переключаться между окнами Internet Explorer, которые уже открыты в фоновом режиме. Проблема в том, что эти окна Internet Explorer будут иметь точно такое же имя (только разные PID)

Что я уже пробовал:

Я пробовал работать с
AppActivate
однако это, по-видимому, принимает только оконные дескрипторы по имени.

Function GetObjInts()
        If Process.GetProcessesByName("iexplore").Length >= 1 Then
            For Each ObjProcess As Process In Process.GetProcessesByName("iexplore")
                'Get the list of IDs for us to cycle.
                ObjInts.Add(ObjProcess.Id)
            Next
        End If
End Function


Function Swap()
        For Each Id As Integer In ObjInts
                AppActivate(Id)
                SendKeys.SendWait("~")
            End If
        Next
End Function



Любые альтернативные идеи о том, как поменять местами окна с тем же именем (по PID?), будут оценены по достоинству!

1 Ответов

Рейтинг:
2

Felsfurt

Вы собираетесь хотите, чтобы использовать функцию user32.dll .

Объявите функцию следующим образом:

Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer


Использовать API очень просто. Вот пример фрагмента.
<System.Runtime.InteropServices.DllImport("user32.dll")>
<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)>
Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal flags As ShowWindowEnum) As Boolean
End Function

<System.Runtime.InteropServices.DllImport("user32.dll")>
Private Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As Integer
End Function

Private Enum ShowWindowEnum
    Hide = 0
    ShowNormal = 1
    ShowMinimized = 2
    ShowMaximized = 3
    Maximize = 3
    ShowNormalNoActivate = 4
    Show = 5
    Minimize = 6
    ShowMinNoActivate = 7
    ShowNoActivate = 8
    Restore = 9
    ShowDefault = 10
    ForceMinimized = 11
End Enum

Public Sub BringMainWindowToFront(ByVal processName As String)
    Dim bProcess As Process = Process.GetProcessesByName(processName).FirstOrDefault()
    If bProcess IsNot Nothing Then
        If bProcess.MainWindowHandle = IntPtr.Zero Then
            ShowWindow(bProcess.Handle, ShowWindowEnum.Restore)
        End If

        SetForegroundWindow(bProcess.MainWindowHandle)
    Else
        Process.Start(processName)
    End If
End Sub


Вы можете изменить BringMainWindowToFront для ваших собственных нужд (например, с помощью PID).

Надеюсь, это поможет!