这里的代码示例似乎给出了您的要求。修改版:
public class DesktopWindow
{
public IntPtr Handle { get; set; }
public string Title { get; set; }
public bool IsVisible { get; set; }
}
public class User32Helper
{
public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll", EntryPoint = "GetWindowText",
ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction,
IntPtr lParam);
public static List<DesktopWindow> GetDesktopWindows()
{
var collection = new List<DesktopWindow>();
EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
{
var result = new StringBuilder(255);
GetWindowText(hWnd, result, result.Capacity + 1);
string title = result.ToString();
var isVisible = !string.IsNullOrEmpty(title) && IsWindowVisible(hWnd);
collection.Add(new DesktopWindow { Handle = hWnd, Title = title, IsVisible = isVisible });
return true;
};
EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero);
return collection;
}
}
使用上面的代码,调用User32Helper.GetDesktopWindows()
应该给你一个包含所有打开的应用程序的句柄/标题的列表,以及它们是否可见。请注意,true
无论窗口的可见性如何,都会返回,因为该项目仍会按照作者的要求显示在任务管理器的应用程序列表中。
然后,您可以使用集合中某个项目的相应 Handle 属性来使用其他窗口函数(例如ShowWindow或EndTask)执行许多其他任务。