1

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:

enter image description here

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 
5
  • 1
    Not sure if it is the problem but the call is SetForegroundWindow() with a lowercase 'g' Commented Sep 14, 2017 at 8:36
  • 1
    There are a lot of restrictions on which processes can set the foreground window (msdn.microsoft.com/en-us/library/windows/desktop/…) so it may be that you are falling foul of one of these. First though, I would check that a valid handle is being returned by FindWindow() and then check the return from SetForegroundWindow(). Note: One of the restrictions is that the process cannot be being debugged. Commented Sep 14, 2017 at 8:52
  • I wonder if this is your real code, given that the first code you posted fails with a hard runtime error. You also appear to completely neglect error checking. Why? Have you contemplated debugging? Commented Sep 14, 2017 at 8:55
  • SetForegroundWindow works when the process is the only foreground process. 1) But in my case Outlook, Microsoft Word is foreground process 2) then my application starts as foreground process and then it triggers "other application" to become foreground. 3) in such case how can i be the most foreground process even Outlook, Microsoft word was? Commented Sep 14, 2017 at 9:36
  • When i use ` ShowWindow(Handle, 9)` then the only problem is Chrome window size get changed and also position get changed. I do not want to change any position or size when bringing the Chrome window in the foreground. Commented Sep 14, 2017 at 19:10

1 Answer 1

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)

enter image description here

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 
Sign up to request clarification or add additional context in comments.

Comments