How to bring external application window on top? [duplicate]

别等时光非礼了梦想. 提交于 2019-12-11 09:25:40

问题


I have Outlook express always on top and Google chrome behind Outlook. How to bring running Google chrome on top of OutLook express using visual basic?

Following opens a new application but i want existing Google chrome to bring on top?

Shell("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", AppWinStyle.MaximizedFocus)

EDIT:

Public Class Form1
  Declare Auto Function FindWindow Lib "User32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
  Declare Auto Function SetForegroundWindow Lib "User32.dll" (ByVal Hwnd As IntPtr) As Long
  'Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Int32) As Int32
  Declare Auto Function FindWindowEx Lib "User32.dll" (ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr


  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Shell("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", AppWinStyle.MaximizedFocus)
    Dim Handle As IntPtr = FindWindow("Notepad", Nothing)
    If Handle.Equals(IntPtr.Zero) Then
      End
    End If

    'Dim HandleChildOne As IntPtr = FindWindowEx(Handle, IntPtr.Zero, "Notepad", IntPtr.Zero)
    'If HandleChildOne.Equals(IntPtr.Zero) Then
    'End
    'End If

    Dim Result As Integer = SetForegroundWindow(Handle)
    If Result.Equals(0) Then
      End
    Else
      MsgBox("Above 0: success. https://msdn.microsoft.com/en-us/library/windows/desktop/ms633539(v=vs.85).aspx " & Result)
    End If
  End Sub

  Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    End
  End Sub
End Class

回答1:


Method 1 of @Codexer works (Method 2, 3 also included for research later). Note that, Chrome window position/size get unexpectedly modified while applying ShowWindow(Handle, 9)

Public Class Form1
  Declare Auto Function FindWindow Lib "User32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
  Declare Auto Function SetForegroundWindow Lib "User32.dll" (ByVal Hwnd As IntPtr) As Long
  Declare Auto Function FindWindowEx Lib "User32.dll" (ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
  Declare Auto Function SetWindowPos Lib "User32.dll" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
  Const HWND_TOPMOST = -1
  Const HWND_NOTOPMOST = -2
  Const SWP_NOSIZE = &H1
  Const SWP_NOMOVE = &H2
  Const SWP_NOACTIVATE = &H10
  Const SWP_SHOWWINDOW = &H40

  Declare Auto Function ShowWindow Lib "User32.dll" (handle As IntPtr, nCmdShow As Integer) As Boolean
  Declare Auto Function IsIconic Lib "User32.dll" (handle As IntPtr) As Boolean

  ' Method 1
  Private Sub StartOrShowProcess(ByVal strProcessName As String)
    Try
      Dim handle As IntPtr
      Dim proc As Process() = Process.GetProcessesByName(strProcessName)
      If proc.Count > 0 Then
        For Each procP As Process In proc
          handle = procP.MainWindowHandle
          ' Do we have handle and minimized or not minimized?
          If handle <> 0 Then
            ShowWindow(handle, 9)
            SetForegroundWindow(handle)
          End If

        Next
      Else 'Not running or started...
        Process.Start(strProcessName)
      End If

    Catch ex As Exception
      'Handle your error...
    End Try
  End Sub

  ' Method 2/3
  Private Sub Old()
    '=== Method 1: Target chrome > as new window
    'Shell("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", AppWinStyle.MaximizedFocus)

    '=== Method 2: Target chrome > Target specific TAB
    Dim Handle As IntPtr = FindWindow(Nothing, "Nieuw tabblad - Google Chrome")
    If Handle.Equals(IntPtr.Zero) Then
      Handle = FindWindow(Nothing, "TITLE... - Google Chrome")
      If Handle.Equals(IntPtr.Zero) Then
        End
      End If
    End If

    ' !!!ShowWindow!!!! help to detect from minmize state
    ShowWindow(Handle, 9)
    Dim Result As Integer = SetForegroundWindow(Handle)
    If Result.Equals(0) Then
      End
    End If
  End Sub

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.TopMost = True
    StartOrShowProcess("chrome")
  End Sub

  Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    End
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    End
  End Sub
End Class


来源:https://stackoverflow.com/questions/46213751/how-to-bring-external-application-window-on-top

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!