windows消息机制与实例

windows发送窗口消息

  所需工具:spy++,visual studio 2017,c#语言 

  技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为:

  [DllImport("user32.dll")]
       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

  此函数获得目标窗口的句柄,如果要获得某个子窗口的句柄,通过以下函数可获得:

  [DllImport("User32.dll ")]
      public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string FrmText);

  对目标窗口的操作(发送指令),使用的函数原型如下:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
      public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

  我通过SendMessage函数发送的是绘图动作,具体包括鼠标的down,move,up

  另一个发送消息的函数,原型声明:

   [DllImport("User32.dll", EntryPoint = "PostMessage")]
       private static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

  我通过PostMessage函数发送的是点击按钮的动作,具体包括鼠标的down,up

SendMessage与PostMessage函数的差别

  SendMessage为这个指定的消息调用窗口处理程序,直到窗口处理完这个程序后才会返回;PostMessage函数发送一个消息到线程消息对列中,并立即返回。

失败部分:1.在绘图过程中,我考虑过用WM_PAINT发送绘图消息,但是查看MSDN手册后发现WM_PAINT消息是由系统产生的,它不应该由一个应用程序发送。我也考虑过先生成一个图形,然后将它发送到窗口,这样违背了最初测试的目的。

失败经验总结:首先要确定技术路线,不能盲目乱试,查看官方文档的函数介绍。

Windows中的消息机制:消息就是一些指令。如果你想让窗口或控件(实质上,控件是特殊的窗口)执行何种动作,你应该传送一个消息给它;如果另一个窗口想让你执行何种操作,它可以传送一个消息给你。如果一个事件,如敲击键盘、移动鼠标、点击按钮等,系统将消息传送给窗口,如果你是这些窗口之一,你将接收到消息执行相应的操作。

消息队列:当消息发送过来,将消息加入消息队列,当一个消息被处理时,将其从消息队列移除。这样确保消息不会丢失,当你正在处理一个消息时,其它到来的消息可以加入到消息队列直到被处理。

消息循环:

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg); //可选,有的会用到
    DispatchMessage(&Msg);
}

1. 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(程序阻塞)。

2. 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息 时返回0;如果返回值为负表明发生了错误。

3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。

4. 上面的步骤执行完后,将消息传递给DispatchMessage()函数。DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。

5. 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。
6. 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。

    

时间: 2024-07-30 13:32:30

windows消息机制与实例的相关文章

005 windows消息机制

#windows消息机制 新建第一个Win32应用程序 VS2015 新建项目 Win32应用程序 // Win32WindowDemo.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "Win32WindowDemo.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 WCHAR szTitle[MAX_LOADSTRING]; // 标

收藏:Windows消息机制

百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是由线程(Thread)创建的.Windows系统通过消息机制来管理交互,消息(Message)被发送,保存,处理,一个线程会维护自己的一套消息队列(Message Queue),以保持线程间的独占性.队列的特点无非是先进先出,这种机制可以实现一种异步的需求响应过程. 消息的是什么

从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第一讲 WPF中 windows消息机制

谈到桌面应用程序,我们第一反应就是它的消息机制是怎么处理的,那么我们就先聊聊这个windows消息机制 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win

(转载)Windows消息机制

文章出处:http://www.cnblogs.com/watsonyin/archive/2005/12/12/295536.html Windows消息机制 Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的.如果不理解Windows消息处理机制,肯定无法深入的理解Windows编程.可惜很多程序员对Windows消息只是略有所闻,对其使用知之甚少,更不了解其内部实现原理,本文试着一步一步向大家披露我理解的Windows消息机制.可以说,

Windows 消息机制

Windows 消息机制 Windows是一个消息驱动的操作系统. 如绘制窗体的消息 WM_PAINT. 结构体定义: 消息分类-发送途径 队列消息. Windows为每一个执行中的程序维护一个消息队列.由应用程序自己取出,如WM_TIMER. 非队列消息. 此类消息来自特定的Windows函数,如UpdateWindow()函数直接向窗体处理函数发送WM_PAINT重绘消息. 消息分类-发送者 系统消息.是提前定义的UINT常量. 用户消息. 通过RegisterWindowMessage()

windows消息机制(MFC)

windows消息机制(MFC) 消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样. time表示产生消息的时间,pt表示产生消息时鼠标的位置. 按照类型,Windows将消息分为: (0) 消息ID范围 系统定义消息ID范围:[0x0000, 0x03ff]用户自定义的消息ID范围: WM_USER: 0x0400-0x7FFF 

windows消息机制

一. windows消息机制处理流程 (1)windows会为每一个正在执行的windows应用程序建立一个消息队列,即应用程序队列,用来存放该程序可能创建的各种窗口的消息. 当应用程序发生事件后,windows将事件转化为消息并将消息放入应用程序的消息队列中. (2)应用程序通过GetMessage从消息队列中检索事件消息并把他们分发到相应窗口的消息处理函数中. while(GetMessage(&msg, NULL, 0, 0)) { // 将虚拟键消息转换为字符消息 TranslateMe

IOS消息机制应用实例--异常处理

IOS消息机制应用实例--异常处理 最近发现了一个在项目中常用的异常处的工具NullSafe,分析了它的实现原理,不小心发现了一个小Bug,现将其分享出来,关于这篇文章的Demo已经上传至GitHub,看完如有收获,欢迎Star,如有疑问欢迎issue,大家一起学习.在IOS开发中我们可能会遇到下面的情景:服务器给我们返回得某个字段是null,比如someValue:null,这个时候我们利用第三方工具转化之后会得到someValue = <null>,这个时候如果我们判断这个someValu

深入Delphi -- Windows 消息机制

http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by machine 大家是不是很奇怪为什么我还没说到Delphi的控件呢? 不过不用着急,有关深入控件的内容,将会很快出现了,但在这之前, 还得了解Windows图形界面程序的机制--Windows的消息机制. 使用过Delphi的朋友都知道,Delphi是一个真正面向对象的编程环境, 但是不但如此,De