首页
学习
活动
专区
工具
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 应用程序中所有窗口中的键盘焦点。

56340

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 也可以给自己发消息,

3K31
  • 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 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制

    76820

    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.4K30

    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

    64310

    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

    92050

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

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

    2.1K50

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

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

    1.9K50

    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

    Windows 消息循环

    根据微软的建议,WM_APP类消息用于程序之间的消息通信,而 WM_USER 类消息则最好用于某个特定的窗口类。...消息循环驱动整个程序跑起来。 想一睹消息循环究竟是如何跑起来的? 原始 win32 窗口是如何被创建的? 在 VS 中,新建一个win32的窗口程序,即可看到。...这意味着,可以在 DispatcherObject 中(如 Window 中), 使用 this.Dispatchcer 获取到 Dispatchcer 。...在默认的 WPF UI 线程中:App.Current.Dispatcher = DispatcherObject.Dispatcher 所有的线程(UI线程,普通线程)都有 Dispatcher 吗?...4.3 Dispatcher 如何实现跨线程的调用 最常使用 Dispatcher 的创建就是,在后台线程更新 UI ,那 Dispatcher 是如何做到的呢。

    7910

    在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绑定,这需要依赖属性来绑定。在其他情况下,您可能希望访问这些属性,但是添加绑定并不合适,也不容易实现。例如,当您希望直接从代码访问本地化的值时。

    2K20

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

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

    1.8K21

    学习 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

    62810

    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

    54630

    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 属性获取当前窗口所在屏幕的虚拟屏幕坐标,将上一步计算到的窗口相对于屏幕的坐标减去当前的屏幕的虚拟坐标才是计算到正确的坐标值

    31210

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

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

    1.5K20

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

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

    1.5K90

    将 WPF 窗口嵌入到 MFC 窗口中

    MFC中调用WPF教程_system::windows::interop;-CSDN博客 MFC中调用WPF教程 | Microsoft Learn Step1 当前 MFC 项目修改 为当前 MFC...项目添加公共语言运行时支持 这里只能使用 .NET Framework 的框架支持,而不能使用 .NET Core,因为使用 .NET Core 要求当前项目的输出类型为“类库”,而不能是可执行文件...为当前 MFC 项目添加 .NET Framework 框架的必要引用 Step2 新建 .NET Framework WPF 项目 新建 WPF 项目,并删除 WPF 工程中的 App.xaml 和...MFC 的窗口和控件,有青色背景的是 WPF 嵌入到 MFC 中的窗口。...Library 通过上面的代码,其实可以看到,将 WPF 窗口嵌入到 MFC 中,重点就是拿到 WPF 窗口的句柄,然后使用 Windows API 就可以将窗口嵌入了

    15010

    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.5K20
    领券