1.4 How can I find all programs with a GUI (not just arbitrary windows) that are running on my local machine?


You could use EnumWindows with p/Invoke, but using the static Process.GetProcesses() found in the System.Diagnostics namespace will avoid the interop overhead.

[C#]
     Using System.Diagnostics;
     ...
     foreach ( Process p in Process.GetProcesses(System.Environment.MachineName) )
     {
          if( p.MainWindowHandle != IntPtr.Zero)
          {
               //this is a GUI app
               Console.WriteLine( p ); // string s = p.ToString();
          }
     }

[VB.NET]
     Imports System.Diagnostics
     ...
     Dim p As Process
     For Each p In Process.GetProcesses(System.Environment.MachineName)
          If p.MainWindowHandle <> IntPtr.Zero Then
               'this is a GUI app
               Console.WriteLine(p) ' string s = p.ToString();
          End If
     Next p


There is one potential problem on Windows 98. If a process was started with ProcessStartInfo.UseShellExecute set to true, this MainWindowHandle is not available.

© 2001-2010 Copyright Syncfusion Inc. All rights reserved.  |  Privacy Policy  |  Contact  |  Sitemap