gpt4 book ai didi

c# - EnumWindows 返回关闭的 Windows 应用商店应用程序

转载 作者:太空狗 更新时间:2023-10-29 22:15:35 25 4
gpt4 key购买 nike

使用这段代码:

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 项目列出了当前页面的标题。因为我最近从崩溃中恢复过来并且只加载了那个页面。

我的问题是:

  1. 为什么列出了我的已关闭 Windows 应用商店应用程序? (甚至两次)
  2. 为什么会列出我的 Edge 选项卡?
  3. 如何过滤 Edge 选项卡和已关闭的 Windows 应用商店应用?

编辑:

  1. 通过“过滤器”:仅检索具有可见窗口的应用程序。对于我的用例,只有 3 个窗口可见。

我试图获取每个窗口的 WsStyle 和 WsEXStyle 进行比较,但我找不到任何区别。

IsWindowVisible() 方法无法过滤掉不可见的 Windows 应用商店应用。

最佳答案

Why are my closed Windows Store apps being listed?

因为它们实际上并没有关闭。使用任务管理器的“进程”选项卡很容易看到。您会看到拥有这些窗口的进程已暂停。作为 WinRT(也称为 UWP、Store、Modern UI、Metro)编程框架方法的一部分,现代机器具有足够的 RAM,即使用户不与它们交互也可以保持进程运行。再次快速将它们带回并节省电池生命周期。如果其他地方需要 RAM,则操作系统将通过终止此类进程来挽救它。

Why are my Edge tabs being listed?

因为 Edge 也是一个 WinRT 应用。

How can I filter the Edge tabs and the closed Windows Store apps?

考虑到窗口实际上并未关闭,您并不完全清楚要根据哪个属性进行过滤。 GetWindowThreadProcessId() 和 IsImmersiveProcess() 可以告诉你,你正在处理这样一个进程。考虑 IsWindowVisible()。也许this post可以提供帮助,还可以告诉您为什么会看到多个窗口。


编辑(Nicke Manarin):

通过检查 Cloacked 属性,可以忽略隐藏/后台应用商店应用:

DwmGetWindowAttribute(handle, (int)DwmWindowAttribute.Cloaked, out bool isCloacked, Marshal.SizeOf(typeof(bool)));

if (isCloacked)
return true;

编辑 2(Nicke Manarin):

每个 Edge 选项卡的行为都像一个窗口(我相信这与您可以拖动选项卡以创建新窗口这一事实有关)。

关于c# - EnumWindows 返回关闭的 Windows 应用商店应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43927156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com