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()函数返回,继续循环处理下一个消息。
windows消息机制与实例的更多相关文章
- <Win32_1>深入浅出windows消息机制[转自crocodile_]
上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...
- 收藏:Windows消息机制
百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...
- 深入理解windows 消息机制
深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...
- windows消息机制框架原理【简单版本】
windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g).一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线 ...
- Windows消息机制
Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...
- 我对windows消息机制的理解(参考深入浅出MFC,欢迎批评指正!!)
以消息为基础,以事件驱动之 程序的进行依靠外部消息来驱动,即:程序不断等待任何可能的输入,然后做判断,然后再做适当的处理. 消息输入:操作系统捕获,以消息形式进入程序.(操作系统通过其USERS模块中 ...
- 深入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 m ...
- 转:Windows消息机制要点
Windows消息机制要点 1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...
- windows消息机制(转)
1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...
随机推荐
- JavaScript正则表达式检验与递归函数实际应用
JS递归函数(菲波那切数列) 实例解析: 一组数字:0 1 1 2 3 5 8 13 0 1 2 3 4 5 6 7 sl(0)=0; sl ...
- php面试题汇总三(基础篇附答案)
问题 1. 如何访问会话变量(session)? A.通过$_GET B.通过$_POST C.通过$_REQUEST D.通过全局变量 E.以上都不对 2. 哪个函数能让服务器输出如下 header ...
- js中callback.call()和callback()的区别
js中callback.call()和callback()的区别在js中callback.call()和callback() 有什么区别,举个例子:function a(){alert('hello! ...
- noi2015 day1 T2软件包管理器
noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- 【Centos7】安装memcached
1.Linux系统安装memcached,首先要先安装libevent库. 安装libevent库有两种方式 (1)rpm安装 yum install libevent libdeve (2)源码包安 ...
- 以打印日志为荣之logging模块详细使用
啄木鸟社区里的Pythonic八荣八耻有一条: 以打印日志为荣 , 以单步跟踪为耻; 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python ...
- tomcat设置文件编码
tomcat修改bin文件夹下面的catalina.bat文件可以解决乱码在文件中加上JAVA_OPTS="-server -Xms128M -Xmx4096M -XX:PermSize=5 ...
- MyBatis --- 动态SQL、缓存机制
有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中w ...
- java 读取json
http://blog.csdn.net/5iasp/article/details/38545875 private void readAccount() throws IOException { ...
- 关于 ThinkPHP 在 Nginx 服务器上 使用U方法跳转问题
这个问题已多次遇到,关于tp 框架 使用U 方法跳转, 在Nginx 服务器上可能会遇到路由跳转不过去前面带点(如:./xx) 解决这个问题,可以在tp的入口文件 index.php 里定义个常量 d ...