本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。...可以运行代码:wpf-issues/ChildWindows 在上面的网站有详细的视频告诉大家是如何做的就可以看到这个问题。...因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。 但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。...在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。...所以在模态窗口关闭的时候,就忽略了主窗口可以激活,于是找到主窗口下方的一个可以被激活的窗口,这时激活他,于是这个被找到的窗口就在主窗口的上面。 那么这个问题可以如何解决?
本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。...可以运行代码:wpf-issues/ChildWindows 在上面的网站有详细的视频告诉大家是如何做的就可以看到这个问题。...因为模态窗口会在关闭的时候,让主窗口不在最前,所以团队不敢使用模态窗口。 但是这个问题在看了 Windows 历史之后,才发现这个问题是 Windows 的问题。...在窗口关闭的时候,Windows 会找一个在这个窗口下方的第一个可用的窗口,激活他。因为弹出模态窗口的主窗口是被禁用的。...参见 关闭模态窗口后,父窗口居然跑到了其他窗口的后面
想知道你在 WPF 编写 Window.ShowDialog() 之后,WPF 框架是如何帮你实现模态窗口的吗? 本文就带你来了解这一些。...---- Window.ShowDialog WPF 显示模态窗口的方法就是 Window.ShowDialog,因此我们直接进入这个方法查看。...Window.ShowDialog 的源代码可以在这里查看: Window.cs 这个方法非常长,所以我只把其中与模态窗口最关键的代码和相关注释留下,其他都删除(这当然是不可编译的): 1 2 3 4...不要紧,我再简化一下: EnumThreadWindows 获取当前线程的所有窗口 把当前线程中的所有窗口都禁用掉(用的是 Win32 API 的禁用哦,这不会导致窗口内控件的样式变为禁用状态) 将窗口显示出来...ShowHelper 接下来的重点方法是 Window.ShowDialog 中的那句 Show()。
---- 开发中的模态窗口 在各种系统、语言和框架中,只要有用户可以看见的界面,都存在模态窗口的概念。...拿 Windows 系统中的模态对话框为例子,大概就像下面这两张图片这样: 有一个小的子界面盖住了主界面,要求用户必须进行选择。...关于 WPF 框架是如何实现模态窗口的,可以阅读:直击本质:WPF 框架是如何实现模态窗口的 关于如何自己实现一个跨越线程/进程边界的模态窗口,可以阅读:实现 Windows 系统上跨进程/跨线程的模态窗口...UWP 中的新 API 当然已经都是使用 async/await 来实现模态等待了,不过 WPF/Windows Forms 比较早,只能使用 Dispatcher 线程模型来实现模态等待。...详见:WPF window 子窗口反馈效果(抖动/阴影渐变) - 唐宋元明清2188 - 博客园 通常你不需要手工处理这些消息,但是如果你完全定制了窗口样式,则可能需要自行做一个这样的模态窗口提醒效果。
如果不用到 Win32 方法,可以尝试遍历所有窗口获取 Owner 判断,不过此方法仅仅适合只有一个主线程 通过 Win32 的 EnumChildWindows 可以拿到某个窗口句柄的所有子窗口,大概用法如下...) gcChildhandlesList.Target; childHandles.Add(hWnd); return true; } } 使用方法是先拿到窗口的句柄...,然后传入 GetAllChildHandles 方法,就可以拿到所有子窗口的句柄 var windowInteropHelper = new WindowInteropHelper...PINVOKE: Getting all child handles of window · Software adventures and thoughts 使用 EnumWindows 找到满足你要求的窗口
前言 默认创建的窗口是可以拖拽放大缩小的,但是如果窗口设置为透明,就不能拖拽了。
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息的窗口和系统资源通知窗口 (3)用于用户交互的可见窗口 (4)...用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 WPF内部的5个窗口 对于Windows系统来说,它是一个消息系统,消息系统的核心就是窗口...对于WPF来说也是如此。那么WPF内部为什么需要窗口,又存在哪些窗口呢?...接下来我会来介绍究竟这5个Win32的窗口如何帮助WPF处理消息,我会根据每个窗口创建的顺序来介绍。...第五步,在窗口过程中,优先级队列当中取一个DispatcherOperation。
本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 foreach(Window window...in Application.Current.Windows ) { Console.WriteLine(window.Title); } 如果需要获取一个线程的窗口,请看代码...handleList.Add(hWnd); return true; }, IntPtr.Zero); } return handleList; } WPF...一个空的 WPF 程序有多少个窗口 WPF 内部的5个窗口之 MediaContextNotificationWindow
本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 foreach(Window window...in Application.Current.Windows ) { Console.WriteLine(window.Title); } 如果需要获取一个线程的窗口,请看代码...一个空的 WPF 程序有多少个窗口 WPF 内部的5个窗口之 MediaContextNotificationWindow ---- 本文会经常更新,请阅读原文: https://...8F%A3.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
弹出一个模态窗口,然后将模态窗口的父窗口设置为自身窗口; 切换到其他程序窗口中(比如 Windows 资源管理器窗口); 切换回此模态窗口,然后关闭这个模态窗口上。...你会发现,模态窗口关闭后,父窗口并没有回到当前的顶层显示中。取而代之的,是其他程序的窗口(比如 Windows 资源管理器窗口)。...然后,回到模态子窗口中,把它关掉: ? 我们期待模态子窗口关掉后,它的父窗口会在顶层继续供我们操作,但实际上,Windows 资源管理器却成为了顶层,我们的程序“掉下去了”: ?...而这本书作者推荐的方法是: 重新激活所有者窗口 销毁模态对话框 于是,我试着监听模态子窗口的 Closing 事件,在其中写下主窗口的激活调用,自此 BUG 才算解决。...或者统一模态子窗口的窗口样式,在样式中解决这个 BUG,这样,所有使用了此窗口样式的模态子窗口也将解决问题。
由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被监听到。然而,如果我们希望监听的是整个应用程序中所有的事件呢?...路由事件的路由可并不会跨越窗口边界呀? 本文将介绍我编写的应用程序窗口监视器,来监听整个应用程序中所有窗口中的路由事件。这样的方法可以用来无时无刻监视 WPF 程序的各种状态。...于是,我们只需要遍历 Windows 集合便可以获得应用程序中的所有窗口,然后对每一个窗口监听需要的路由事件。...比如,由于 Windows 系统的特性,整个用户空间内,统一时刻只能有一个窗口能处于激活状态。我们可以利用当前窗口的激活与非激活的切换时机再去寻找新的窗口。...} 在 Window_Activated 和 Window_Deactivated 事件中,我们主要也是在做初始化。
本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法。在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边。...WPF属性,否则会破坏RestoreBounds,且WPF窗口自身在最大化时,不会修改 Left Top Width Height 属性 {...,此类型依赖一些 Win32 方法的定义,这部分我就不在博客中写出,大家可以从本文最后获取所有源代码 /// /// 用来使窗口变得全屏的辅助类 /// 采用设置窗口位置和尺寸...WPF属性,否则会破坏RestoreBounds,且WPF窗口自身在最大化时,不会修改 Left Top Width Height 属性 {...WPF 属性与 Win32 位置一致,防止有逗比全屏后改 WPF 的属性,发生一些诡异的行为 //下面这样做其实不太好,会再次触发
本文告诉大家在 WPF 内部的5个窗口的 MediaContextNotificationWindow 是做什么的 在本文开始之前,希望大家先看下面的博客 WPF的消息机制(一)- 让应用程序动起来 WPF...的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口 WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口 而 MediaContextNotificationWindow...是在 MediaContext 的构造函数创建的,用来提供给创建他的 MediaContext 可以有接收和转发向顶级窗口广播的窗口消息的能力 在 MediaContextNotificationWindow...因为 DWM 通知只是广播给最顶层的窗口。...通过这个方式就可以让 WPF 的 MediaContext 接收到最顶层窗口的消息 代码请看 https://referencesource.microsoft.com/#PresentationCore
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息窗口以及系统资源通知窗口 (3)用于用户交互的可见窗口 (4)...用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 处理应用程序激活和系统关闭的窗口(Window 2#) 创建时机:在调用Application.Run...WPF为了安全起见没有让UI窗口来处理应用程序激活,反激活,以及操作系统关闭时对应的消息,而是内部创建了一个隐藏的窗口,专门用来接收WM_ACTIVATEAPP和WM_QUERYENDSESSION两个...WPF在应用出现的MainWindow在初始化完成后,会创建一个隐藏的窗口,专门处理来自系统相关资源更新后的消息,比如WM_ThemeChanged,WM_SystemColorChanged,WM_DisplayChange...跟Window2#的初衷类似,为了安全起见,没有通过可见的UI窗口来处理这些消息,而是内容创建了这个隐藏的Window4#窗口来处理这些消息,确保UI窗口可以安全的更新由于系统Theme及相关资源改变后的表现
在 WPF 中,如果想要使用代码控制,让某个窗口作为当前用户的输入的逻辑焦点的窗口,也就是在当前用户活动的窗口的最上层窗口,默认使用 Activate 方法,通过这个方法在大部分设备都可以做到激活窗口...组合可以让窗口作为当前用户活动的,即使窗口之前是最小化或隐藏,都可以通过 Show 的方法显示 但是某些设备窗口被盖在其他的窗口的下面,此时的窗口的 window.IsActive 还是 true 但是调用...Activate 不会让窗口放在上层 我在网上看到好多小伙伴调用了 SetForegroundWindow 方法,其实现在 WPF 是开源的,可以看到 Window 的 Activate 方法是这样写...Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原 5.最后SetForegroundWindow 在 WPF 中对应的更改窗口的顺序使用的是...Topmost 属性,同时设置顺序需要做一点小的更改 在 WPF 中通过 c# - Bring a window to the front in WPF - Stack Overflow 可以了解到如何用
本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机。...这是一个开发时的辅助机制,用来让开发者不要随便弹出窗口,我又好奇这个监控模块是如何监控到我弹出一个窗口的,学习了监控模块的机制,就写了这个博客 在 WPF 里面,可以通过 EventManager 监听全局的路由事件...于是就可以进行监控窗口创建显示 监听窗口的 SizeChangedEvent 路由事件是比较靠谱的方式,这个有一点点违反开发者的想法,开发者默认想的是使用 LoadedEvent 事件。...但是在 WPF 里面做了一些性能优化,如果一个窗口没有 XAML 或者是没有任何代码监听了 Loaded 事件,那将不触发 LoadedEvent 路由事件。...也可以在事件里面对每个窗口注入一些有趣的逻辑,或者是监听窗口的各个事件,输出更多日志,让开发者可以通过日志了解到当前有哪些窗口依然还在显示 这是另一位大佬写的代码,请看 https://gist.github.com
而 MediaContextNotificationWindow 是在 MediaContext 的构造函数创建的,用来提供给创建他的 MediaContext 可以有接收和转发向顶级窗口广播的窗口消息的能力...,这个窗口是不可见的,这样就可以接受到 WM_DWMCOMPOSITIONCHANGED 和其他的 DWM 通知。...因为 DWM 通知只是广播给最顶层的窗口。...通过这个方式就可以让 WPF 的 MediaContext 接收到最顶层窗口的消息 代码请看 https://referencesource.microsoft.com/#PresentationCore...MediaContextNotificationWindow.cs,969a2072bf29a084 ---- 本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/WPF
好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部的5个窗口之 MediaContextNotificationWindow...听说有五个窗口 可以通过 user32 的 EnumThreadWindows 找到一个线程的窗口 delegate bool EnumThreadDelegate(IntPtr hWnd...id 的方法需要先获取进程,在 Loaded 之后尝试获取 WPF 的进程,通过 Process.GetCurrentProcess() 可以拿到当前的进程 通过 process.Threads 可以拿到进程的线程...14 个窗口,但是如果将代码移动到 WPF 的构造函数,会发现只有两个窗口 public MainWindow() { var handleList...内部的5个窗口之 MediaContextNotificationWindow
好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部的5个窗口之 MediaContextNotificationWindow...听说有五个窗口 可以通过 user32 的 EnumThreadWindows 找到一个线程的窗口 delegate bool EnumThreadDelegate(IntPtr hWnd...id 的方法需要先获取进程,在 Loaded 之后尝试获取 WPF 的进程,通过 Process.GetCurrentProcess() 可以拿到当前的进程 通过 process.Threads 可以拿到进程的线程...14 个窗口,但是如果将代码移动到 WPF 的构造函数,会发现只有两个窗口 public MainWindow() { var handleList...内部的5个窗口之 MediaContextNotificationWindow ---- 本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/WPF
领取专属 10元无门槛券
手把手带您无忧上云