WPF 内部的5个窗口之 MediaContextNotificationWindow

原文:WPF 内部的5个窗口之 MediaContextNotificationWindow

本文告诉大家在 WPF 内部的5个窗口的 MediaContextNotificationWindow 是做什么的

在本文开始之前,希望大家先看下面的博客

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

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

WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口

而 MediaContextNotificationWindow 是在 MediaContext 的构造函数创建的,用来提供给创建他的 MediaContext 可以有接收和转发向顶级窗口广播的窗口消息的能力

在 MediaContextNotificationWindow 的代码核心是

            HwndWrapper hwndNotification;
            hwndNotification = new HwndWrapper(0, NativeMethods.WS_POPUP, 0, 0, 0, 0, 0, "MediaContextNotificationWindow", IntPtr.Zero, null);

            _hwndNotificationHook = new HwndWrapperHook(MessageFilter);

            hwndNotification.AddHook(_hwndNotificationHook);

这里代码是创建在最顶层的窗口,这个窗口是不可见的,这样就可以接受到 WM_DWMCOMPOSITIONCHANGED 和其他的 DWM 通知。因为 DWM 通知只是广播给最顶层的窗口。

通过这个方式就可以让 WPF 的 MediaContext 接收到最顶层窗口的消息

代码请看 https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Media/MediaContextNotificationWindow.cs,969a2072bf29a084



本文会经常更新,请阅读原文:
https://lindexi.gitee.io/post/WPF-%E5%86%85%E9%83%A8%E7%9A%845%E4%B8%AA%E7%AA%97%E5%8F%A3%E4%B9%8B-MediaContextNotificationWindow.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页


本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系

原文地址:https://www.cnblogs.com/lonelyxmas/p/10582105.html

时间: 2024-10-09 18:27:13

WPF 内部的5个窗口之 MediaContextNotificationWindow的相关文章

WPF 获取应用的所有窗口

原文:WPF 获取应用的所有窗口 本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 foreach(Window window in Application.Current.Windows ) { Console.WriteLine(window.Title); } 如果需要获取一个线程的窗口,请看代码 delegate bool EnumThreadDelegate(IntPtr hWn

WPF中使用WindowChrome自定义窗口中遇到的最大化问题

原文:WPF中使用WindowChrome自定义窗口中遇到的最大化问题 FrameWork 4.5 之后,内置了WindowChrome类,官方文档: https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome.aspx 如果你是旧版本,可以去搜索单独的dll. 上方的页面,解释和例子也都是旧版本的,如果新版本,比如和我一样,是4.6.2,可以继续往下看新的用法,相比文档中的旧方式,新的用法的确更简单有效了

WPF 多屏时子窗口的屏幕位置问题

问题: 在多个显示屏运行的情况下,如果将主窗口从当前显示屏移动到另一显示屏. 设置子窗口单例模式,在当前显示屏时弹出后,在主窗口移动到另一显示屏后,再弹出子窗口时,你会发现子窗口跑到原来显示屏去了. ----这是WPF的锅 因为已经设置了WindowStartupLocation="CenterOwner",也加了Owner的情况下,窗口每次弹出,理论上就该和主窗口保持在同一屏幕的. 解决: 通过窗口的Activated添加委托,每次窗口唤醒,都重新设置窗口的Location subW

WPF内部DeliverEvent读锁和PrivateAddListener写锁导致死锁

?? 准备工作 1.对失去响应进程创建转储文件 2.配置该进程的pdb文件 3.复制该进程所在机器的系统dll(sos.dll, clr.dll, mscordacwks.dll) 4.配置系统dll的pdb文件路径, 或者直接从msdl.microsoft/download/symbols下载(注意端口是否被封) 分析过程: 1.利用~*e !clrstack 得到UI线程的ID 为12 2.利用~12e !clrstack -p 得到堆栈信息及函数参数值 3.从中发现先申请写锁, 后申请读锁

浏览器内部缩放与浏览器窗口缩放

接到一个需求,要做网页的自适应.要求网页在不同的分辨率下显示出相应的效果. 之前一直很模糊,浏览器内部的缩放是不是就能模拟出不同的分辨率呢?解释起来有点复杂. 1:浏览器内部的缩放是指网页在浏览器内部的显示比例.在chrome里面 通过Ctrl+/-来调节. 举个例子:比如桌面的分辨率是1920*1080,浏览器窗口大小没有改变,你的网页的显示默认是100%情况下. 如果减少网页的显示比例,那么,你的网页的实际分辨率为(1929*1080)*XX%,这样可能会出现网页显示不正常的情况. (正常情

WPF 每次只打开一个窗口

if(downListControl == null || downListControl.IsVisible == false) { downListControl = new DownloadListControl(); downListControl.Show(); } else { MessageBox.Show("对不起,下载窗口也打开!不要重复打开"); downListControl.Activate(); downListControl.WindowState = Wi

WPF程序如何自定义启动窗口并传参

首先,找到App.xaml,将Application标签中的StartupUri属性去掉; 然后可以在MainWindow.xaml.cs中重载构造函数,并添加自己想要的参数; 然后在App.xaml.cs中重写OnStartUp方法,实例化一个目标窗口对象,然后调用Show方法即可;

在wpf或winform关闭子窗口或对子窗口进行某个操作后刷新父窗口

父窗口: ///<summary>///弹出窗口 ///</summary>///<param name="sender"></param>///<param name="e"></param>privatevoid miFuncSet_Click(object sender, RoutedEventArgs e){WinFuncSetting funcSetting =new WinFuncS

周末充电之WPF(四).多窗口之间操作

多窗口实例: 1.在多个窗口的情况下如何自定义指定要启动的窗口程序 1 <Application x:Class="toolbar.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 StartupUri="MainWin