For applications that use multiple processes (e.g., chrome, firefox, etc.) there is no guarantee the FirstOrDefault() will return a process where Process.MainWindowHandle contains a valid Window handle. For example, consider the following console application -
Module Module1
<DllImport("user32.dll", SetLastError:=True)>
Function IsWindowVisible(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Sub Main()
Dim procs As Process() = Process.GetProcessesByName("Firefox")
For Each proc As Process In procs
If proc.MainWindowHandle <> 0 Then
Console.WriteLine("Firefox process id {0} MainWindowHandle visible: {1}", proc.Id, IsWindowVisible(proc.MainWindowHandle))
Else
Console.WriteLine("Firefox process id {0} MainWindowHandle is 0", proc.Id)
End If
Next
End Sub
End Module
Task manager showing the Firefox processes -
Console application output -