枚举“永远在上面”的所有窗口

我想为我们的Webtesting服务器写一个实用程序,它杀死所有具有“始终在上”窗口的进程。 我想这是窗口样式WS_EX_TOPMOST ,但是,我不是100%确定。

在C#中有一种方法:

  • 枚举所有“永远在上面”的窗口
  • 并检索相应的过程?

这是一个工作示例,它可以找到所有具有最顶层窗口的进程。 但要小心:Windows资源管理器总是有一个最上面的窗口,你可能不想杀死这个进程。

 class Program { const int WS_EX_TOPMOST = 0x00000008; const int WS_VISIBLE = 0x10000000; const int GWL_STYLE = -16; const int GWL_EXSTYLE = -20; static void Main(string[] args) { var topmostWindowHandles = new ArrayList(); EnumWindows(EnumWindowsCallback, topmostWindowHandles); var processesToKill = new HashSet<uint>(); foreach (IntPtr hWnd in topmostWindowHandles) { uint processId = 0; GetWindowThreadProcessId(hWnd, out processId); processesToKill.Add(processId); } foreach (uint pid in processesToKill) { Process proc = Process.GetProcessById((int)pid); Console.WriteLine("Killing " + proc.ProcessName); // kill process, except explorer.exe } } static bool EnumWindowsCallback(IntPtr hWnd, ArrayList lParam) { int exStyle = GetWindowLong(hWnd, GWL_EXSTYLE); int style = GetWindowLong(hWnd, GWL_STYLE); if ((exStyle & WS_EX_TOPMOST) == WS_EX_TOPMOST && (style & WS_VISIBLE) == WS_VISIBLE) { lParam.Add(hWnd); } return true; } public delegate bool EnumWindowsProc(IntPtr hwnd, ArrayList lParam); [DllImport("user32.dll")] [return:MarshalAs(UnmanagedType.Bool)] static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, ArrayList lParam); [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [DllImport("user32.dll")] static extern int GetWindowLong(IntPtr hWnd, int nIndex); } 

这里有一个解决方案,它可以找到所有具有最高主窗口的进程:

 class Program { static void Main(string[] args) { int WS_EX_TOPMOST = 0x00000008; int GWL_EXSTYLE = -20; foreach (Process proc in Process.GetProcesses()) { IntPtr hWnd = proc.MainWindowHandle; int res = GetWindowLong(hWnd, GWL_EXSTYLE); if ((res & WS_EX_TOPMOST) == WS_EX_TOPMOST) { Console.WriteLine("Topmost window found for process " + proc.ProcessName); } } } [DllImport("user32.dll")] static extern int GetWindowLong(IntPtr hWnd, int nIndex); } 

这只会检查进程的主窗口是否最顶层。 我留下这个答案,因为它可能有助于解决这个问题(找到最主要的窗口)。