首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Windows10中的WPF代码,如何获取当前正在运行的程序的所有窗口(而不仅仅是顶层窗口)?

在Windows10中,可以使用WPF代码获取当前正在运行的程序的所有窗口,包括非顶层窗口。以下是一种实现方法:

首先,需要引用System.Diagnostics和System.Runtime.InteropServices命名空间。

然后,可以使用以下代码获取当前正在运行的程序的所有窗口:

代码语言:txt
复制
using System.Diagnostics;
using System.Runtime.InteropServices;

public class WindowHelper
{
    [DllImport("user32.dll")]
    private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);

    [DllImport("user32.dll")]
    private static extern bool IsWindowVisible(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    [DllImport("user32.dll")]
    private static extern int GetWindowTextLength(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [DllImport("user32.dll")]
    private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

    public static List<WindowInfo> GetAllWindows()
    {
        List<WindowInfo> windows = new List<WindowInfo>();
        EnumWindows((hWnd, lParam) =>
        {
            if (IsWindowVisible(hWnd))
            {
                int length = GetWindowTextLength(hWnd);
                if (length > 0)
                {
                    StringBuilder sb = new StringBuilder(length + 1);
                    GetWindowText(hWnd, sb, sb.Capacity);
                    RECT rect;
                    GetWindowRect(hWnd, out rect);
                    windows.Add(new WindowInfo
                    {
                        Handle = hWnd,
                        Title = sb.ToString(),
                        Left = rect.Left,
                        Top = rect.Top,
                        Width = rect.Right - rect.Left,
                        Height = rect.Bottom - rect.Top
                    });
                }
            }
            return true;
        }, IntPtr.Zero);
        return windows;
    }
}

public class WindowInfo
{
    public IntPtr Handle { get; set; }
    public string Title { get; set; }
    public int Left { get; set; }
    public int Top { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
}

使用示例:

代码语言:txt
复制
List<WindowInfo> windows = WindowHelper.GetAllWindows();
foreach (WindowInfo window in windows)
{
    Console.WriteLine("Title: " + window.Title);
    Console.WriteLine("Handle: " + window.Handle);
    Console.WriteLine("Position: " + window.Left + ", " + window.Top);
    Console.WriteLine("Size: " + window.Width + " x " + window.Height);
    Console.WriteLine();
}

这段代码将获取当前正在运行的程序的所有窗口,并输出窗口的标题、句柄、位置和大小等信息。

请注意,这只是一种实现方法,可能还有其他方法可以达到相同的效果。此外,这段代码只适用于Windows平台,并且需要以管理员权限运行才能获取所有窗口的信息。

对于WPF开发,可以使用此方法获取当前正在运行的程序的所有窗口,并根据需要进行进一步的处理和操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何追踪 WPF 程序当前获得键盘焦点元素并显示出来

---- 使用调试工具查看当前获得键盘焦点元素 Visual Studio 带有实时可视化树功能,使用此功能调试 WPF 程序 UI 非常方便。...使用代码查看当前获得键盘焦点元素 我们打算在代码编写追踪焦点逻辑。...当然,为了最好显示效果,你需要将这个控件放到最顶层。 绘制并实时显示 WPF 程序当前键盘焦点元素 如果我们需要监听应用程序所有窗口中的当前获得键盘焦点元素怎么办呢?...于是,你需要我在另一篇博客方法来监视整个 WPF 应用程序所有窗口如何监视 WPF 所有窗口,在所有窗口中订阅事件或者附加 UI 里面有一段对 ApplicationWindowMonitor...由于每一次窗口激活状态切换都会更新当前激活窗口,所以,我们可以监听整个 WPF 应用程序所有窗口键盘焦点。

52540

WPF 渲染原理

WPF 有三个主要模块 PresentationFramework、 PresentationCore 和基础层 在 WPF顶层,也就是给开发者使用元素,元素显示就是使用 DrawingContext...但是这个代码只提供让窗口在哪里显示,如何显示就需要下面的代码 DirectX 这就是 WPF 渲染最底层库,可以渲染 WPF 几乎所有控件,需要注意 WPF 使用是 Dx9 或 Dx12...GDI 这个代码依赖显卡,是进行 CPU 渲染接口,提供了绘制原语和提高质量 CLR 因为 WPF 现在还运行在 dotnet framework 所以需要使用运行时,提供了普通类和方法,用来方便开发者...,大概有 30 万 API 可以使用 Device Drivers 设备驱动程序是在系统特殊用来驱动一些硬件 在下面使用代码实际都是从最上层拿到,只有最上层代码,微软才会开放。...消息循环 在 WPF 也是使用消息循环,因为在之前很多程序都是需要自己写消息循环才可以收到用户交互,这里消息循环就是 Windows 会向 WPF 发送一些消息,而且 WPF 也可以给自己发消息,

2.9K31
  • dotnet 读 WPF代码笔记 使用 Win32 方法修改窗口坐标和大小对窗口依赖属性影响

    /// HWND_NOTOPMOST:将窗口置于所有顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。...适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动露出窗口所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口任何部分和父窗口需要重画部分。...但是此时依赖属性没有跟随变化 原因还需要从完全开源 WPF 仓库里面了解,官方开源仓库放在 https://github.com/dotnet/wpf 欢迎大家下载所有代码 在 src\Microsoft.DotNet.Wpf...GetWindowRect 方法获取 Win32 窗口坐标和大小 更改依赖属性逻辑是放在 WmMoveChangedHelper 方法代码如下 internal void WmMoveChangedHelper...但是宽度和高度属性就没有这个判断 当前 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制

    75520

    WPF 多指触摸拖拽窗口 拖动修改窗口坐标

    WPF ,如果是鼠标点击拖动窗口坐标,可以调用 Window DragMove 方法,但是如果是触摸,就需要自己调用 Win32 方法实现 在 WPF ,调用 Window DragMove...相信大家都知道,在修改某个容器坐标的时候,不能使用这个容器内坐标做参考,所以在 Touch 拖动修改窗口坐标的时候,就不能使用监听窗口事件拿到坐标来作为参考 想要能平滑移动窗口,就需要获取相对于屏幕坐标...此时不能通过 Window Top 和 Left 属性获取,这两个属性使用WPF 单位和坐标,咱计算 dx 和 dy 是相对于屏幕坐标,因此需要调用 GetWindowRect 这个... /// HWND_NOTOPMOST:将窗口置于所有顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。...适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动露出窗口所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口任何部分和父窗口需要重画部分。

    2.2K30

    【译】Visual Studio 2019 WPF & UWP XAML 开发工具新特性

    以前,该功能会显示附件中正在运行应用程序完整实时可视化树,而无法通过过滤器仅查看您在应用程序编写 XAML。...实时可视化树Just My XAML 可移动应用内工具栏(v16.3): 应用程序内工具栏已得到增强,可在正在运行 WPF / UWP 应用程序中移动,从而使开发人员能够在应用程序向左或向右拖动它以解除阻止应用程序...XAML设计器 WPF Designer 现在完全适用于 WPF .NET Core 项目(v16.3): 现在,所有客户都可以普遍使用 (GA)WPF .NET Core 应用程序 XAML 设计器...XAML编辑器 XAML(v16.0)智能感知支持: IntelliCode 是一种AI辅助 IntelliSense,适用于多种语言,可预测开发人员最可能使用正确 API,不仅仅是字母顺序成员列表...您还可以使用 Windows 应用程序打包项目为具有 Islands .NET Core 3 生成 MSIX。要了解如何入门,请访问我们文档。

    7.3K30

    WPF 内部5个窗口之 MediaContextNotificationWindow

    本文告诉大家在 WPF 内部5个窗口 MediaContextNotificationWindow 是做什么 在本文开始之前,希望大家先看下面的博客 WPF消息机制(一)- 让应用程序动起来 WPF...消息机制(二)- WPF内部5个窗口之隐藏消息窗口 WPF消息机制(三)- WPF内部5个窗口之处理激活和关闭消息窗口以及系统资源通知窗口 MediaContextNotificationWindow...new HwndWrapperHook(MessageFilter); hwndNotification.AddHook(_hwndNotificationHook); 这里代码是创建在最顶层窗口...因为 DWM 通知只是广播给最顶层窗口。...通过这个方式就可以让 WPF MediaContext 接收到最顶层窗口消息 代码请看 https://referencesource.microsoft.com/#PresentationCore

    61610

    WPF消息机制(二)- WPF内部5个窗口之隐藏消息窗口

    目录 WPF消息机制(一)-让应用程序动起来 WPF消息机制(二)-WPF内部5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭消息窗口和系统资源通知窗口 (3)用于用户交互可见窗口 (4)...用于UI窗口绘制可见窗口 WPF消息机制(三)-WPF输入事件来源 WPF消息机制(四)-WPFUI更新 WPF内部5个窗口 对于Windows系统来说,它是一个消息系统,消息系统核心就是窗口...在上一篇,我们频繁提及“线程”,“Dispatcher”其实,运行WPF应用程序所在线程就是WPF所谓UI线程,在Application.Run之后,调用Dispatcher.Run时会检查当前线程是否已经存在了一个...通常情况下,一个WPF应用程序运行起来时候,后台会创建5个Win32窗口,帮助WPF系统来处理操作系统以及应用程序内部消息。...接下来我会来介绍究竟这5个Win32窗口如何帮助WPF处理消息,我会根据每个窗口创建顺序来介绍。

    1.9K50

    Windows 下高 DPI 应用开发(UWP WPF Windows Forms Win32)

    现在,你可以通过在设置打开一个开关,使得无需注销,只要重新打开应用即可让此应用获取到最新系统 DPI 值。...所有显示器上应用共用这一个 DPI 值。 每个用户会话固定一个 DPI 值,修改 DPI 后不需要重启系统只需要注销当前用户重新登录即可。... Per-Monitor V1 和 Per-Monitor V2 支持在操作系统级别是兼容,所以只需要修改 WPF 应用程序清单即可兼容第二代屏幕级 DPI 感知。...混合 DPI 感知级别 当项目足够大时候,一个或几个项目成员可能很难了解所有窗口逻辑。让一个进程所有窗口开启 DPI 缩放对应用高 DPI 迁移来说比较困难。...,大概是 Windows 98 开始就支持通过 GDI 相关 API 获取当前系统 DPI 值(当时 Windows Phone 之前 Windows 移动端 OS 通过这种 API 支持 PPI

    85950

    WPF 获取全局所有窗口创建显示事件 监控窗口打开

    本文将告诉大家如何WPF 里面进行全局监控任意窗口创建显示打开,可以获取到每个 WPF 窗口打开时机。...这是一个开发时辅助机制,用来让开发者不要随便弹出窗口,我又好奇这个监控模块是如何监控到我弹出一个窗口,学习了监控模块机制,就写了这个博客 在 WPF 里面,可以通过 EventManager 监听全局路由事件...通过路由事件监听,即可了解是哪个窗口正在准备弹出。...于是就可以进行监控窗口创建显示 监听窗口 SizeChangedEvent 路由事件是比较靠谱方式,这个有一点点违反开发者想法,开发者默认想使用 LoadedEvent 事件。...也可以在事件里面对每个窗口注入一些有趣逻辑,或者是监听窗口各个事件,输出更多日志,让开发者可以通过日志了解到当前有哪些窗口依然还在显示 这是另一位大佬写代码,请看 https://gist.github.com

    2K50

    Windows wpf(下载应用介绍教程)

    一、窗体类基本概念     对于WPF应用程序,在Visual Studio和Expression Blend,自定义窗体均继承System.Windows.Window类。...用户通过窗口与 Windows Presentation Foundation (WPF) 独立应用程序进行交互。 窗口主要用途是承载可视化数据并使用户可以与数据进行交互内容。...独立 WPF 应用程序使用 Window 类来提供它们自己窗口。在 WPF ,可以使用代码或 XAML 标记来实现窗口外观和行为。...显示窗体 构造函数 Show()、ShowDialog()方法:Show()方法显示非模态窗口,这意味着应用程序运行模式允许用户在同一个应用程序激活其他窗口。...窗体激活     在首次打开一个窗口时,它便成为活动窗口(除非是在 ShowActivated 设置为 false 情况下显示)。 活动窗口当前正在捕获用户输入(例如,键击和鼠标单击)窗口

    1.2K20

    WPF 已知问题 开启 WM_Pointer 消息之后 获取副屏触摸数据坐标偏移

    本文记录 WPF 触摸一个已知问题,仅在开启 WM_Pointer 消息之后,将应用程序运行在包含多个屏幕带触摸屏设备上,如此时在非主屏幕触摸屏上进行触摸,使用 GetStylusPoint 或...复现步骤: 创建一个空 WPF 程序,按照 WPF dotnet core 如何开启 Pointer 消息支持 博客提供方法开启 WM_Pointer 消息 在 MainWindow 放入 InkCanvas...运行程序,将程序窗口移动到副屏上,对应用程序进行触摸 此时你将会发现应用程序无法绘制出你所画出笔迹。...正确实现应该考虑当前窗口所在屏幕虚拟屏幕坐标,如以下 少珺 小伙伴修复后代码 private void GetOriginOffsetsLogical(out int originOffsetX...再经过 _currentTabletDevice.DeviceInfo.DisplayRect 属性获取当前窗口所在屏幕虚拟屏幕坐标,将上一步计算到窗口相对于屏幕坐标减去当前屏幕虚拟坐标才是计算到正确坐标值

    30710

    在VisualStudio中提供运行时和设计时支持WPF本地化解决方案

    在这种情况下,我还想: 在运行时切换区域设置——可自动更新所有得本地化元素 使用现有的可以在Visual Studio维护资源文件(**.resx files)。...这篇文章第一种方法(不使用LocBaml.exe目标本地化,https://www.codeproject.com/KB/WPF/Article.aspx)给了我很多启发,但为了在运行时自动更新元素...使用代码 ObjectDataProvider自动更新 为了在更改当前区域设置时自动更新元素,我正在利用ObjectDataProvider提供功能特性。...在资源文件扩展名添加区域性代码,如在Resources.Fr-fr.resx,在编译应用程序时,Visual Studio将使用它创建本地化DLL。...限制 在本例,我使用WPF绑定,这需要依赖属性来绑定。在其他情况下,您可能希望访问这些属性,但是添加绑定并不合适,也不容易实现。例如,当您希望直接从代码访问本地化值时。

    1.9K20

    使用 SetParent 跨进程设置父子窗口一些问题(小心卡死)

    在微软官方文档,说 SetParent 可以在进程内设置,也可以跨进程设置。当使用跨进程设置窗口父子关系时,你需要注意本文提到一些问题,避免踩坑。...同样,无论是 B、C 还是 D 在处理消息时候,其他窗口也会同样卡在 GetMessage 调用。这样,所有进程 UI 线程实际上会互相等待,所有通过消息循环执行代码都不会同时执行。...然而实际上 Windows GUI 应用程序开发基本上 UI 代码都是通过消息循环来执行,所以这几乎等同于所有进程 UI 线程强制同步成类似一个 UI 线程效果了。...带来副作用也就相当明显,任何一个进程卡了 UI,其他进程 UI 将完全无响应。当然,不依赖消息循环代码不会受此影响,比如 WPF 应用程序动画和渲染。...你必须清楚跨进程设置父子窗口带来各种副作用,然后针对性地给出解决方案: 比如所有窗口会强制串联成一个队列,那么可以考虑将暂时不显示窗口断开父子关系; 比如设置窗口位置大小等操作,必须考虑此窗口不是顶层窗口问题

    1.3K20

    WPF 自定义文本框输入法 IME 跟随光标

    ImmSetCompositionWindow 用来设置输入法窗口坐标,也是本文最重要函数 本文接下来将告诉大家如何一步步实现封装对 IME 输入法调用,在本文最后将会给出所有的源代码 这部分对输入法逻辑可以封装为一个类...需要重新绑定输入法,告诉输入法当前窗口获取输入焦点,可以使用如下代码,通过修改附加属性值,通过附加属性变更调用到 WPF 框架逻辑,从而修复此问题 if (_defaultImeWnd...); 输入法在输入过程,将会通过 Windows 消息和当前窗口进行通讯,如获取输入框所需坐标和输入文本等。...代码 本文所有代码放在github 和 gitee 欢迎访问 可以通过如下方式获取本文代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文代码.../lindexi/lindexi_gd.git 获取代码之后,打开 LightTextEditorPlus.sln 文件 参考文档 WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本 Can

    1.8K21

    WPF 程序如何移动焦点到其他控件

    WPF 可以使用 UIElement.Focus() 将焦点设置到某个特定控件,也可以使用 TraversalRequest 仅仅移动焦点。本文介绍如何WPF 程序控制控件焦点。... WPF 有多个焦点范围(Focus Scope),按下 Tab 键切换焦点时候只会在当前焦点范围切焦点,不会跨范围。那么一旦跨范围切焦点时候,焦点会去哪里呢?答案是逻辑焦点。...比如默认情况下 WPF 每个 Window 就是一个焦点范围,那么每个 Window 当前焦点就是逻辑焦点。...一旦这个 Window 激活,那么这个窗口逻辑焦点就会成为键盘焦点,另一个窗口当中逻辑焦点保留,键盘焦点则丢失。...跨窗口/跨进程切换焦点 参见我另一篇博客: WPF 程序如何窗口/跨进程设置控件焦点 ---- 参考资料 winapi - Win32: C++: How do I re-focus on Parent

    49430

    学习 Avalonia 框架笔记 如何创建一个全屏置顶 X11 应用窗口

    本文记录我从 Avalonia 框架里面学到如何创建一个全屏置顶 X11 应用窗口方法 开始之前,先从 Avalonia 或 CPF 里面拷贝足够代码,这部分代码可以从本文末尾找到下载方法 设置全屏核心代码是以下三行...IntPtr((int)(EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev); } 如此即可获取一个全屏且在所有窗口...,包括任务栏上层顶层 X11 窗口 以上代码是从 https://github.com/AvaloniaUI/Avalonia/blob/b5db6bb0f6c19070e2a09a23231bcc1e01c40610...,以下是我在 Hyperv 虚拟机运行效果,可以看到绘制两条线段在所有应用上方,也在任务栏上方 完全 Program.cs 文件代码如下 using CeaherecelallLemlalnohuce...github 和 gitee 上,可以使用如下命令行拉取代码 先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文代码 git init git remote

    54010

    WPF消息机制(一)- 让应用程序动起来

    Post到特定窗口所在线程消息队列,应用程序消息循环再不断从消息队列当中获取消息,然后再派发给特定窗口窗口过程来处理,在窗口过程完成一次用户交互。...其实,WPF底层也是基于Win32消息系统,那么对于WPF应用程序来说,它是如何跟Win32消息交互,这里到底存在一个什么样机制?...(3)用于UI窗口绘制可见窗口 (4)用于用户交互可见窗口 WPF消息机制(三)-WPF输入事件来源 WPF消息机制(四)-WPFUI更新 让应用程序动起来 谈到WPF消息,首先应该知道...通过调用堆栈可以看出,蓝色部分是启动了一个线程,VisualStudio在Host进程当中运行当前应用程序;红色部分是从Application.Main函数开始执行,经过几个函数到达Dispatcher.Run...循环调用GetMessage方法从当前线程消息队列当中不停获取消息,取出一个msg之后,交给TranslateAndDispatchMessage方法Dispatch到不同窗口过程去处理。

    1.4K90

    UWP 和 WPF 对比

    因为 UWP 渲染使用是 DirectComposition WPF 使用 Desktop Window Manager,请不要在这里和我说 WPF 使用 DX9 。...那么 DWM 作用是什么,实际上从博客可以看到 DWM 实际作用 Windows 组合引擎或合成程序,需要每个窗口把显示内容给屏外表面或缓冲区,缓冲区是系统给每个顶层窗口分配所有的 GDI、D3D...然后 DWM 决定如何显示,是组合窗口还是做特效,最后再把缓存放到显卡。 参见:Why use DirectComposition?...(Windows) 定制 虽然开始 WPF 定制不好,但是现在 WPF 定制是很好,可以使用 Host 加入其他程序,可以使用 dx 加入。...如何WPF 使用 dx 是相对比较难,但是可以使用 SharpDx 和 SharpGL 使用 dx 和 opg。

    5.4K20

    Qt 第一步 HelloWorld 第一个程序

    开始写Qt 相关文章主要原因是,我本人在编写一个视频录制及相关处理项目,写到一半发现.net winform 相关UI处理限制较大;虽然我也可以使用WPF 进行编写,但是我本人并没有接触过WPF...在项目内容,有一个层级结构,顶层是一个Hello,展开后分为如下部分: 后缀为 .pro 文件:项目管理文件,例如项目设置项 Headers:包含项目头文件,mainwindow.h 为主窗口类头文件...mainwindows.ui 为当前项目主窗口界面文件 编辑UI界面 mainwindows.ui 为当前窗口界面文件,双击打开: ?...如图所示,左侧当前区域显示为设计,这时将可以设计当前窗口UI界面,在左侧小部件中找到lable 标签拖拽至设计窗体。 ?...点击左下角绿色运行按钮即可运行当前编辑好窗体应用程序: ?

    1.1K20
    领券