有的程序可以打开多个窗口并显示在任务栏上。某些情况下,我们需要找到窗口做些事情时,可以参考下面的代码。
public static class Win32Api
{
[DllImport("user32.dll", SetLastError = true)]
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
public enum GetWindow_Cmd : uint
{
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
}
class Program
{
static void Main(string[] args)
{
GetWindowCount(Process.GetProcessesByName("myapp")[0]);
}
private static void GetWindowCount(Process process)
{
int windowCount = 0;
Thread.Sleep(1000);
int processId = process.Id;
Win32Api.EnumWindows((IntPtr hWnd, IntPtr lParam) =>
{
int id;
Win32Api.GetWindowThreadProcessId(hWnd, out id);
IntPtr parentWindow = Win32Api.GetWindow(hWnd, Win32Api.GetWindow_Cmd.GW_OWNER);
if (id == processId && parentWindow == IntPtr.Zero && Win32Api.IsWindowVisible(hWnd))
{
windowCount++;
}
return true;
}, IntPtr.Zero);
Debug.WriteLine($"process window: {windowCount}");
}
}