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

  
前言

  谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互。

  其实,WPF的底层也是基于Win32的消息系统,那么对于WPF应用程序来说,它是如何跟Win32的消息交互,这里到底存在一个什么样的机制?接下来我会通过下面几篇博文介绍这个消息机制:

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

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

  (1)隐藏消息窗口

  (2)处理激活和关闭的消息的窗口和系统资源通知窗口

  (3)用于UI窗口绘制的可见窗口

  (4)用于用户交互的可见窗口

  WPF的消息机制(三)-WPF输入事件的来源

  WPF的消息机制(四)-WPF中UI的更新

  让应用程序动起来

  谈到WPF的消息,首先应该知道DispactherObject以及Dispatcher在WPF系统中的作用。

  WPF大部分的对象都是从DispatcherObject派生的,从这里派生的对象具有一个明显的特征,那就是:修改对象时所在的线程,和创建对象时所在线程必须为同一个线程,这就是微软所谓的线程亲缘性(Thread affinity)的最简单理解。那么谁能保证线程亲缘性呢?那就是Dispacher了。从DispatcherObject派生的类型继承三个重要的成员:Dispatcher属性,CheckAccess(), VerifyAccess()方法。其中后面两个方法就是检验线程亲缘性的。按照WPF的实现,如果你自己定义了个WPF的类型,并且是DispatcherObject的子类,你就必须在public的成员定义的逻辑开始处,调用base.Dispatcher.VerifyAccess(),检验线程亲缘性。那么Dispatcher到底还做了什么事情呢?

  首先,我们看一下一个WPF的Application在启动之后都走了哪些逻辑:

  通过调用堆栈可以看出,蓝色的部分是启动了一个线程,VisualStudio在Host的进程当中运行当前应用程序;红色的部分是从Application.Main函数开始执行,经过几个函数到达Dispatcher.Run(),最后到达Dispather.PushFrameInpl()方法。那么一个Application在Run之后,为什么要调用Dispatcher.Run()呢,他做了些什么事情你?如果通过Reflector仔细查看Application.Run(),你会发现里面实际起作用的代码并不多,最后都是Dispatcher.Run在做事情。那么一个Application启动之后,按照以前对Win32的消息机制的理解,当应用程序启动后,必须进入消息循环,对于WPF,也是一样的。那么WPF应用程序是在什么地方进入消息循环呢?其实这就是Dispatcher.Run()做的事情。查看上图最后一步Dispacther.PushFrameImpl()的代码,你会看到有下面的一段代码:

  很明显,橙色的部分是一个循环,看起来是不是很眼熟,跟Win32编程碰到的消息循环是否很像?对了,这就是WPF应用程序进入了消息循环。循环调用GetMessage方法从当前线程的消息队列当中不停的获取消息,取出一个msg之后,交给TranslateAndDispatchMessage方法Dispatch到不同的窗口过程去处理。这样以来,任何需要应用程序处理的消息通过这个过程,被不同的窗口处理了,应用程序就动起来了。

  下面的一篇我会介绍WPF当中的Win32窗口,正是这些窗口,处理着来自系统,或者来自应用程序内部的消息。

时间: 2024-08-07 07:51:35

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

一起谈.NET技术,WPF的消息机制(一)- 让应用程序动起来

前言 谈起"消息机制"这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win32的消息系统,那么对于WPF应用程序来说,它是如何跟Win32的消息交互,这里到底存在

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

目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息窗口以及系统资源通知窗口 (3)用于用户交互的可见窗口 (4)用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新   处理应用程序激活和系统关闭的窗口(Window 2#) 创建时机:在调用Application.Run之后,运行到Application.EnsureHwndSource()方

WPF的“.NET研究”消息机制(一)- 让应用程序动起来

前言 谈起"消息机制"这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win32的消息系统,那么对于WPF应用程序来说,它是如何跟Win32的消息交互,这里到底存在

mvvm-simpleMVVMToolkit消息机制

问题描述 simpleMVVMToolkit消息机制 10C viewmodel 之间的通讯,消息机制,给个小案例,,求一个小小的案例,用的是wpf 解决方案 消息映射:BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏定义这个消息映射的边界.BEGIN_MESSAGE_MAP()宏有两个参数,第一个参数为定义消息映射的当前类名,第二个参数提供一个到该基类的连接,以查找消息处理程序.如果在定义消息映射的类中没有发现消息处理程序,将搜索基类的消息映射. 以第一个为例:ON

iOS开发系列--通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 推送通

J2EE的异步消息机制(上)

在分布式企业级应用程序中,异步消息机制用于有效地协调各个部分的工作. J2EE为我们提供了JMS和消息驱动豆(Message-Driven Bean),用来实现应用程序各个部件之间的异步消息传递. 一.什么是消息系统? 通常一个消息系统允许分开的未耦合的应用程序之间可靠地异步通信.在企业应用时,需要一种异步的,非阻塞的消息传递.比如,一个客户端可能希望给一个服务器发送一个请求后,不在乎是否马上能得到回应.这样,客户端没有理由必须等待服务器处理请求.客户端应用程序在递交一个请求之后,只需确保请求到

Runtime那些事儿(消息机制)

本文是投稿文章,作者:HenryCheng 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtime黑魔法的强大,趁现在有机会分享一下对runtime的一些理解.在对象调用方法是Objective-C中经常使用的功能,也就是消息的传递,而Objective-C是C的超集,所以和C不同的是,Objective-C使用的是动态绑定,也就是runtime.Objective-C的消息传递和消息机制也就不多说了,今天主要说的是动态方法,也就是函

linux GTK教程(消息机制/标签/按钮/图像/文本/对话框/菜单/容器)

GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发.跨平台的图形工具包.最初是为GIMP写的,已成为一个功能强大.设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一. 1.GTK安装 2.一个简单的GTK窗口程序 #include <stdio.h> #include <gtk/gtk.h> int main(int argc, char **argv) { GtkWidget *window; gtk_init(&a

《深入解析Android 5.0系统》——第6章,第6.4节Android的消息机制

6.4 Android的消息机制 深入解析Android 5.0系统 消息驱动是一种进程或线程的运行模式.内部.外部的各种事件都可以放到消息队列中按序处理.这种模式特别适合处理大量的交互事件.Android应用的UI线程,同样采用了消息驱动模式,所有外部来的按键消息.触屏消息.各种系统Intent.广播等都会转化为内部的消息,然后在主线程中分发处理. 6.4.1 消息模型 现在的操作系统普遍采用消息驱动模式.Windows操作系统就是典型的消息驱动类型.但是,Android的消息处理机制和Win