EnumThreadWindows (user32)
Last changed: Lindos Pechos-205.205.212.238

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn,
   IntPtr lParam);

vb Signature:

<DllImport("user32.dll")>_
Friend Shared Function EnumThreadWindows(dwThreadId as Int32, lpfn as EnumThreadDelegate, lParam as IntPtr) as Boolean
End Function

User-Defined Types:

public delegate bool EnumThreadDelegate (IntPtr hwnd, IntPtr lParam);

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Diagnostics;

using System.Runtime.InteropServices;

using System.Threading;

namespace ExitApp

{

    public class ExitApp
    {
        private const UInt32 WM_CLOSE = 0x0010;

        public delegate bool EnumThreadDelegate (IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [STAThread]
        static void Main(string[] args)
        {
            string processName;

            // Find process.
            Process[] p = Process.GetProcessesByName(args[1]);

            if (p.Length > 0)
            {
                foreach(Process proc in p)
                {
                    // Check if main window exists. If the window is minimized to the tray this might be not the case.
                    if (proc.MainWindowHandle == IntPtr.Zero)
                    {
                        // Try closing application by sending WM_CLOSE to all child windows in all threads.
                        foreach (ProcessThread pt in proc.Threads)
                        {
                            EnumThreadWindows((uint) pt.Id, new EnumThreadDelegate(ExitApp.EnumThreadCallback), IntPtr.Zero);
                        }
                    }
                    else
                    {
                        // Try to close main window.
                        if(proc.CloseMainWindow())
                        {
                            // Free resources used by this Process object.
                            proc.Close();
                        }
                    }
                }
            }
        }

        static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam)
        {
            // Close the enumerated window.
            PostMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

            return true;
        }
    }

}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation