【发布时间】:2017-05-11 23:31:34
【问题描述】:
使用此代码:
internal static List<DetectedWindow> EnumerateWindows()
{
var shellWindow = GetShellWindow();
var windows = new List<DetectedWindow>();
EnumWindows(delegate (IntPtr handle, int lParam)
{
if (handle == shellWindow)
return true;
if (!IsWindowVisible(handle))
return true;
if (IsIconic(handle))
return true;
var length = GetWindowTextLength(handle);
if (length == 0)
return true;
var builder = new StringBuilder(length);
GetWindowText(handle, builder, length + 1);
GetWindowRect(handle, out Rect rect);
windows.Add(new DetectedWindow(handle, rect.ToRect(), builder.ToString()));
return true;
}, IntPtr.Zero);
return windows;
}
辅助类:
public class DetectedWindow
{
public IntPtr Handle { get; private set; }
public Rect Bounds { get; private set; }
public string Name { get; private set; }
public DetectedWindow(IntPtr handle, Rect bounds, string name)
{
Handle = handle;
Bounds = bounds;
Name = name;
}
}
我正在获取此应用程序列表(窗口文本 - Rect 边界):
Microsoft Visual Studio - -8;-8;1936;1056
Microsoft Edge - 0;77;1920;963
EnumWindows - Stack Overflow and 7 more pages - Microsoft Edge - -8;-8;1936;1056
Microsoft Edge - 0;77;1920;963
Microsoft Edge - 0;77;1920;963
Microsoft Edge - 0;0;1920;1080
Microsoft Edge - 0;0;1920;1080
Microsoft Edge - 0;8;1920;1040
Microsoft Edge - 0;85;1920;963
Microsoft Edge - 150;79;1532;42
Microsoft Edge - 0;85;1920;963
Microsoft Edge - 0;77;1920;963
Microsoft Edge - 0;85;1920;963
Microsoft Edge - 0;213;1920;964
Microsoft Edge - 0;0;1920;1080
Microsoft Edge - 484;208;952;174
Microsoft Edge - 0;84;1920;964
Microsoft Edge - 0;84;1920;964
Microsoft Edge - 0;84;1920;964
Microsoft Edge - 0;0;1920;1080
Mail - 0;32;1356;693
Mail - 278;252;1372;733
OneNote - 0;8;1920;1040
My notes - OneNote - -8;-8;1936;1056
Photos - 0;32;1920;1008
Photos - -8;-8;1936;1056
Skype - 0;40;1920;1008
Skype - -8;-8;1936;1056
Store - 0;40;1920;1008
Store - -8;-8;1936;1056
Movies & TV - 0;0;1920;1080
Movies & TV - -8;-8;1936;1056
Groove Music - 0;32;1466;712
Groove Music - -7;3;1372;733
Settings - 0;40;1920;1008
Settings - -8;-8;1936;1056
Windows Shell Experience Host - 0;0;1920;1080
我当前未最小化的窗口是Visual Studio 和两个 Edge 窗口(每个窗口有几个选项卡)。我可以理解这样一个事实,即只有一个 Edge 项目列出了当前页面的标题。因为我最近从崩溃中恢复过来,只加载了那个页面。
我的问题是:
- 为什么列出了我的关闭 Windows 应用商店应用程序? (甚至两次)
- 为什么会列出我的 Edge 选项卡?
- 如何过滤 Edge 选项卡和关闭的 Windows 应用商店应用?
编辑:
- 通过“过滤器”:仅检索具有可见窗口的应用程序。在我的用例中,只有 3 个窗口可见。
我试图让每个窗口的 WsStyle 和 WsEXStyle 进行比较,但我找不到任何区别。
IsWindowVisible() 方法无法过滤掉不可见的 Windows 应用商店应用。
【问题讨论】:
-
我了解商店应用的生命周期。但不是关于为什么 EnumWindow (+我的检查)即使在窗口不可见的情况下也会返回那种应用程序。它还返回每个 2 项。