首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WPF 一个空的 WPF 程序有多少个窗口

WPF 一个空的 WPF 程序有多少个窗口

作者头像
林德熙
发布于 2022-08-04 06:36:02
发布于 2022-08-04 06:36:02
54400
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口

WPF 内部的5个窗口之 MediaContextNotificationWindow 听说有五个窗口

可以通过 user32 的 EnumThreadWindows 找到一个线程的窗口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);

获取线程的 id 的方法需要先获取进程,在 Loaded 之后尝试获取 WPF 的进程,通过 Process.GetCurrentProcess() 可以拿到当前的进程

通过 process.Threads 可以拿到进程的线程,封装为一个方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);

        static IEnumerable<IntPtr> EnumerateProcessWindowHandles(Process process)
        {
            var handleList = new List<IntPtr>();

            foreach (ProcessThread thread in process.Threads)
            {
                EnumThreadWindows(thread.Id,
                    (hWnd, lParam) => { handleList.Add(hWnd); return true; }, IntPtr.Zero);
            }

            return handleList;
        }

调用 EnumerateProcessWindowHandles 输出进程就可以拿到这个进程内的所有窗口,于是输入当前的 WPF 的进程,获取一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var handleList = EnumerateProcessWindowHandles(Process.GetCurrentProcess());
            Debug.WriteLine(handleList.Count());
        }

返回的是 14 个窗口,但是如果将代码移动到 WPF 的构造函数,会发现只有两个窗口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public MainWindow()
        {
            var handleList = EnumerateProcessWindowHandles(Process.GetCurrentProcess());
            Debug.WriteLine(handleList.Count());

            InitializeComponent();

            Loaded += MainWindow_Loaded;
        }

WPF 内部的5个窗口之 MediaContextNotificationWindow

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WPF 一个空的 WPF 程序有多少个窗口
好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口
林德熙
2019/03/13
7660
WPF 获取应用的所有窗口
在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口
林德熙
2022/08/04
2.1K0
WPF 获取应用的所有窗口
在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口
林德熙
2019/03/13
2.4K0
WPF 拼音输入法
实际上本文是在使用一个好用的软件 希沃白板 的时候发现在里面很难输入拼音来做课堂活动。
林德熙
2018/09/19
1.7K0
WPF 拼音输入法
wpf键盘记录器
很简单的一个wpf键盘记录器 这个程序我一样用了全局勾子,之前用的都是winform上运行了,前一段时间 在国外的论坛上逛看到了一个wpf能用的就做了一个小程序记录一下,为了方便大家直关的看我在页面上
lpxxn
2018/01/31
1.3K0
wpf键盘记录器
WPF取色器开发
前言 这里全局的键盘钩子和全局鼠标钩子是为了定义快捷键。 获取鼠标坐标 using System.Runtime.InteropServices; namespace ColorPicker.Utils { internal class ZPoint { [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool GetCursorPos(out POINT pt);
码客说
2022/03/13
1.9K0
dotnet C# 全局 Windows 鼠标钩子
本文来告诉大家一个简单的方法实现全局的 鼠标钩子 实现封装方法十分简单,请看代码 public class MouseHookEventArgs : EventArgs { public bool Handle { get; set; } /// <inheritdoc /> public MouseHookEventArgs(MouseMessages mouseMessage) { MouseMes
林德熙
2021/12/23
8630
系统钩子
设置钩子代码 //定义一个钩子实例 var hookProc = new HookProc(HookProcCallback); //设置钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!=IntPtr.Zero){ //设置成功 }
用户1175783
2019/09/18
1.1K0
借助API实现黑盒自动化测试工具的编写
  在日常编码过程中,我们常常会进行自动化测试。这里的自动化测试不是指单元测试,而是模拟人工输入来进行快速的、高并发的测试。可以使用的自动化工具有LOADRUNNER,以及目前在VS2010中的功能很强大的测试工作平台(录制操作步骤,自动生成代码)。但是,这些工具的熟练掌握也有一定的时间成本,并且,最主要的,对于一个程序员来说,那不够灵活。所以,比较高效的一个做法是,调用WINDOWS API,自己动手写编码来实现。
顾翔
2021/07/22
6970
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
一般来说,大家在需要监听全局消息的时候会考虑 SetWindowsHookEx 这个 API。或者需要处理一些非自己编写的窗口的消息循环的时候,也会考虑使用它。
walterlv
2023/10/22
2K0
.NET/C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
WPF写的取色器
昨天有个小伙子,在找取色器工具。我说,这个应该开发起来很简单,于是,摸了大约半个钟的鱼,开发了一个。现在我把源码和操作案例发出来,供有需要的大佬们玩。(功能过于单一和简单,但是能用)
Wesky
2024/08/13
1810
WPF写的取色器
Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇
此篇对应功能实现出自:第3波-与PowerbiDesktop互通互联(Excel透视表连接PowerbiDesktop数据模型)https://www.jianshu.com/p/e05460ad407d
Excel催化剂
2021/08/19
6630
WPF监听快捷键的几种方式
那么,假如我要在一个WPF程序监听CTRL+5按键,首先在主窗口程序添加以下代码:
ryzenWzd
2023/03/23
1.2K0
Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】
我这里是用了一个西红柿闹钟的项目用作测试,因为之前使用该闹钟想提高自己的工作效率时发现该闹钟老是容易被其他应用程序遮挡住,所以才想到让他持续运行在屏幕最前端不被盖住,从而督促自己。
呆呆敲代码的小Y
2023/04/09
2.4K0
Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】
WPF应用单实例
默认情况下 WPF应用是能够多开的,但是大部分情况下我们只想打开一个实例,这就有两种情况
码客说
2023/07/24
3200
Win32 程序在启动时激活前一个启动程序的窗口
发布于 2018-08-05 13:48 更新于 2018-09-01 00:15
walterlv
2018/09/18
1.1K0
通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook)
创建窗口的时候,可以传一个消息处理函数。然而如果窗口不是自己创建的,还能增加消息处理函数吗?答案是可以的,除了 SetWindowsHookEx 来添加钩子之外,更推荐用子类化的方式来添加。
walterlv
2023/10/22
5650
C# WPF获取任务栏时间区域的Rectangle
[StructLayout(LayoutKind.Sequential)] public struct WindowRect { public int left; public int top; public int right; public int bottom; } [DllImport("user32.dll")] priv
liulun
2018/01/12
8210
用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方
我使用 User32 的 SetWindowPos 方法去设置一个跨进程的窗口,这个窗口是停止响应的,将让调用的 SetWindowPos 方法卡住,不继续执行逻辑。通过堆栈分析是卡在 NtUserSetWindowPos 方法上,调用 SetWindowPos 方法不返回
林德熙
2022/08/12
1.1K0
C# 实现 WinForm 全屏置顶
我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式(使其它应用窗体无法遮挡在置顶应用窗体之上),并且进入全屏状态。本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能。
初九之潜龙勿用
2024/12/11
3050
相关推荐
WPF 一个空的 WPF 程序有多少个窗口
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档