How do I differentiate between a process running & an app visible on screen

x38class-9313 141 Reputation points

Norton Security is part of Windows start up, therefore it is always running as a process.
If a user selects Norton icon on desktop, Norton window appears.
On closing the window it only hides the window as distinct from closing the app. (because it is always running)
I need to determine if the user has woken the app to show on the screen & also know when the app is not visible on the screen when the user closes the app.
ie, What is code to indicate the app screen is visible or not visible

An object-oriented programming language developed by Microsoft that is implemented on the .NET Framework. Previously known as Visual Basic .NET.
2,661 questions
0 comments No comments
{count} votes

Accepted answer
  1. RLWA32 43,051 Reputation points

    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))  
                    Console.WriteLine("Firefox process id {0} MainWindowHandle is 0", proc.Id)  
                End If  
        End Sub  
    End Module  

    Task manager showing the Firefox processes -


    Console application output -


    0 comments No comments

5 additional answers

Sort by: Most helpful
  1. Jack J Jun 24,496 Reputation points Microsoft Vendor

    @x38class-9313 , based on my research, I suggest that you could try the Windows API IsWindowVisible function to check if the app is visible or not.

    I make a sample wpf app like your Norton Security.

    Here is a code example you could refer to.

     <DllImport("user32.dll", SetLastError:=True)>  
    Private Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean  
    End Function  
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  
        Dim currentProcess As Process = Process.GetProcessesByName("WpfApp1").FirstOrDefault()  
        Dim t As Boolean = IsWindowVisible(currentProcess.MainWindowHandle)  
    End Sub  



    If the response is helpful, please click "Accept Answer" and upvote it.

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

  2. x38class-9313 141 Reputation points

    Again, thanks for a further suggestion, however as I said before, "Norton Security" is always running so using task manager is not an option.

    this code has no fault:
    Dim currentProcess As Process = Process.GetProcessesByName("chrome")

    Dim currentProcess As Process = Process.GetProcessesByName("chrome").FirstOrDefault()

    fails because there is no "FirstOrDefault()" option to add to this line of code

    your example seems everything I want except for this extension at the end of line that is not available, ie .FirstOrDefault()

  3. x38class-9313 141 Reputation points

    RLWA32-6355, Thanks for that, works fine for me as I just tested it, now to put it to a real test in my Release to users.

    I dont see where I can credit you with accepting your answer

    For, JackJJun-MSFT, obviously you have put in some effort to try & solve for me, much appreciated

  4. x38class-9313 141 Reputation points

    Whilst I have tested and accepted an answer, I find for my purpose there is an issue where there is more than one instance of the process, to resolve this I have decided on using the following which should take care of more than one process running, hope it may be useful to others

    Dim K As Byte
    Dim J As Byte
    Dim Status(10) As String
    Dim Result As String

        Dim prog As New Process
        For Each prog In Process.GetProcesses
            If UCase(prog.ProcessName) = UCase("NortonSecurity") Then
                K += 1
                Dim t As Boolean = IsWindowVisible(prog.MainWindowHandle)
                Status(K) = t.ToString()
            End If
        For J = 1 To K
            If Status(J) = "True" Then
                Result = Status(J)
                Exit For
            End If
        If Result = "" Then
            MsgBox("Not Visible")
        End If