按照 Alt-Tab 列表中的顺序检索打开 windows 的顺序?
Retrieve order of open windows as ordered in the Alt-Tab list?
这是我的 C# 应用程序的完整代码,目标很简单。我想检索系统上打开的 windows,按它们最近打开的方式排序,就像在 Alt-Tab 列表中一样。 Alt-Tab 列表将程序列为它们是上次打开的,因此按 Alt-Tab 并仅松开一次将带您回到上次打开的 window。此代码用于 Windows 10。下面的代码确实获得了我需要的信息,只是顺序不正确。我应该在哪里寻找我需要的信息?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace GetOpenWindowName
{
class Program
{
static void Main(string[] args)
{
Process[] processlist = Process.GetProcesses();
foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
}
}
Console.ReadLine();
}
}
}
所以,在 @PaulF、@stuartd、 和 @IInspectible 的帮助下,这是我所能做到的最好的。
windows 在 Alt-Tab 列表中的顺序大致是 windows 的 z 顺序。 @IInspectible 告诉我们,将 window 设置为 topmost 会打破这一点,但在大多数情况下,可以遵守 z 顺序。所以,我们需要得到open windows.
的z-order
首先,我们需要引入外部函数GetWindow,使用这两行:
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetWindow(IntPtr hWnd, int nIndex);
一旦该函数存在,我们就可以创建这个函数来获取 z 顺序:
public static int GetZOrder(Process p)
{
IntPtr hWnd = p.MainWindowHandle;
var z = 0;
// 3 is GetWindowType.GW_HWNDPREV
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, 3)) z++;
return z;
}
重点:GetWindow函数调用中的三个是标志位:
/// <summary>
/// The retrieved handle identifies the window above the specified window in the Z order.
/// <para />
/// If the specified window is a topmost window, the handle identifies a topmost window.
/// If the specified window is a top-level window, the handle identifies a top-level window.
/// If the specified window is a child window, the handle identifies a sibling window.
/// </summary>
GW_HWNDPREV = 3,
这些是从进程列表中查找 windows 的 z 顺序的构建块,这(在大多数情况下)就是 Alt-Tab 顺序。
实施 EnumWindows 似乎 return windows 按 Tab 顺序
[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
这里很好的解释了如何使用
How can I use EnumWindows to find windows with a specific caption/title?
这是我的 C# 应用程序的完整代码,目标很简单。我想检索系统上打开的 windows,按它们最近打开的方式排序,就像在 Alt-Tab 列表中一样。 Alt-Tab 列表将程序列为它们是上次打开的,因此按 Alt-Tab 并仅松开一次将带您回到上次打开的 window。此代码用于 Windows 10。下面的代码确实获得了我需要的信息,只是顺序不正确。我应该在哪里寻找我需要的信息?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace GetOpenWindowName
{
class Program
{
static void Main(string[] args)
{
Process[] processlist = Process.GetProcesses();
foreach (Process process in processlist)
{
if (!String.IsNullOrEmpty(process.MainWindowTitle))
{
Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle);
}
}
Console.ReadLine();
}
}
}
所以,在 @PaulF、@stuartd、 和 @IInspectible 的帮助下,这是我所能做到的最好的。
windows 在 Alt-Tab 列表中的顺序大致是 windows 的 z 顺序。 @IInspectible 告诉我们,将 window 设置为 topmost 会打破这一点,但在大多数情况下,可以遵守 z 顺序。所以,我们需要得到open windows.
的z-order首先,我们需要引入外部函数GetWindow,使用这两行:
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetWindow(IntPtr hWnd, int nIndex);
一旦该函数存在,我们就可以创建这个函数来获取 z 顺序:
public static int GetZOrder(Process p)
{
IntPtr hWnd = p.MainWindowHandle;
var z = 0;
// 3 is GetWindowType.GW_HWNDPREV
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, 3)) z++;
return z;
}
重点:GetWindow函数调用中的三个是标志位:
/// <summary>
/// The retrieved handle identifies the window above the specified window in the Z order.
/// <para />
/// If the specified window is a topmost window, the handle identifies a topmost window.
/// If the specified window is a top-level window, the handle identifies a top-level window.
/// If the specified window is a child window, the handle identifies a sibling window.
/// </summary>
GW_HWNDPREV = 3,
这些是从进程列表中查找 windows 的 z 顺序的构建块,这(在大多数情况下)就是 Alt-Tab 顺序。
实施 EnumWindows 似乎 return windows 按 Tab 顺序
[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
这里很好的解释了如何使用 How can I use EnumWindows to find windows with a specific caption/title?