我想为我们的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); }
这只会检查进程的主窗口是否最顶层。 我留下这个答案,因为它可能有助于解决这个问题(找到最主要的窗口)。