windows消息队列

合集下载

windows消息机制的工作原理

windows消息机制的工作原理

windows消息机制的工作原理Windows消息机制是一种用于不同进程间进行通信的机制,Windows操作系统以消息队列为基础,将消息作为一种最基本的通信单元进行传输。

在这个机制下,进程之间可以通过发送和接收消息来进行通信。

Windows消息机制的工作原理如下:1. 消息队列的创建:每个进程都有自己的消息队列,用于存储接收到的消息。

当进程初始化时,系统会为该进程创建一个消息队列,并为之分配一个唯一的标识符。

2. 消息的发送:当一个进程需要向其他进程发送消息时,它首先需要明确消息的发送目标。

在Windows中,每个进程都有一个唯一的标识符(句柄),可以用来标识其他进程。

发送消息的进程根据目标进程的标识符,将消息发送到目标进程的消息队列。

3. 消息的接收:当一个进程接收到消息时,它需要从自己的消息队列中读取消息。

Windows提供了一种机制,使得进程可以通过消息循环来接收和处理消息。

消息循环是一个无限循环,负责从消息队列中读取消息,并将消息分发给相应的处理函数。

4. 消息的处理:一旦消息被分发给相应的处理函数,进程就可以根据消息的类型和附加数据来进行相应的处理。

处理函数可以修改进程中的状态,调用相应的函数,或者发送其他消息。

5. 消息的传递:在发送和接收消息的过程中,消息并不是实时传输的。

当一个进程发送消息时,消息并不会立即发送给目标进程,而是先存储在发送进程的消息队列中。

接收进程通过消息循环来读取消息,也是间断性的进行读取。

因此,消息的传递是一种异步的过程。

6. 消息的优先级:Windows中的消息有不同的优先级,系统会根据消息的优先级来确定消息的处理顺序。

一般情况下,系统会优先处理高优先级的消息,然后才会处理低优先级的消息。

7. 消息的同步和异步:在发送消息的过程中,Windows提供了两种方式:同步方式和异步方式。

同步方式下,发送消息的进程会等待接收进程对消息的处理完成,然后才会继续执行。

异步方式下,发送消息的进程不需要等待接收进程的处理结果,可以立即继续执行。

Windows消息大全(最新整理版)

Windows消息大全(最新整理版)
WM_VKEYTOITEM = 46
此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
WM_CHARTOITEM = 47
此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
WM_SETFONT = 48
WM_PAINT = 15
要求一个窗口重画自己
WM_CLOSE = 16
当一个窗口或应用程序要关闭时发送一个信号
WM_QUERYENDSESSION = 17
当用户选择结束对话框或程序自己18
用来结束程序运行或当程序调用postquitmessage函数
WM_QUERYOPEN = 19
当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
WM_ERASEBKGND = 20
当窗口背景必须被擦除时(例在窗口改变大小时)
WM_SYSCOLORCHANGE = 21
当系统颜色改变时,发送此消息给所有顶级窗口
WM_ENDSESSION = 22
发送此消息给一个对话框程序去更改焦点位置
WM_SPOOLERSTATUS = 42
每当打印管理列队增加或减少一条作业时发出此消息
WM_DRAWITEM = 43
当button,combobox,listbox,menu的可视外观改变时发送
此消息给这些空件的所有者
WM_MEASUREITEM = 44
一个窗口被销毁
WM_MOVE = 3
移动一个窗口
WM_SIZE = 5
改变一个窗口的大小
WM_ACTIVATE = 6

windows消息原理

windows消息原理

windows消息原理Windows消息原理是Windows操作系统中一种实现进程间通信的机制。

当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。

消息由消息标识、消息参数和消息回调函数组成。

消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。

消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。

回调函数是接收消息并对其进行处理的函数。

当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。

PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。

而SendMessage函数则会等待目标应用程序处理完消息后才返回。

接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。

回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。

处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。

消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。

发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。

同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。

然而,消息机制也存在一些缺点。

首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。

另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。

因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。

总的来说,Windows消息原理是一种可靠且灵活的进程间通信机制,它为应用程序之间的数据交换提供了一种简单而高效的方式。

Windows 7 安装消息队列

Windows 7 安装消息队列
安装消息队列的步骤
windows 2003:控制面板---添加/删除程序---添加/删除windows组件---应用程序服务器--勾选 消息队列
win7:控制面板---程序和功能---打开或关闭windows功能---勾选 Microsoft Message Queue (MSMQ)服务器
依次展开“Microsoft Message Queue (MSMQ) 服务器”、“Micros器核心”,然后选中要安装的消息队列功能的复选框。
单击“确定”。
如果系统提示您重新启动计算机,请单击“确定”以完成安装。
XP profession:控制面板---添加/删除程序----添加/删除windows组件---勾选 消息队列
在 Windows 7 上安装消息队列的步骤
打开“控制面板”。
单击“程序”,然后在“程序和功能”下,单击“打开或关闭 Windows 功能”。
-或者-
单击“经典视图”,双击“程序和功能”,然后在任务窗格中单击“打开或关闭 Windows 功能”。

Windows多线程及消息队列

Windows多线程及消息队列

1.所谓的worker线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程。

2.微软的多线程模型:Win32说明文件一再强调线程分为GUI线程和worker线程两种。

GUI线程负责建造窗口以及处理主消息循环。

Worker负责执行纯粹的运算工作,如重新计算或重新编页等,这些运算工作会导致主线程的消息队列失去反应。

一般而言,GUI线程绝不会去做那些不能够马上完成的工作。

GUI线程的定义是:拥有消息队列的线程。

任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。

所有对此窗口的改变也都应该由该线程完成。

如果worker线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker线程摇身一变成了GUI线程。

这里的意思是:worker线程不能够产生窗口、对话框、消息框,或任何其他与UI有关的东西。

如果一个worker线程需要输入或输出错误信息,它应该授权给UI线程来做,并且将结果通知给worker线程。

消息队列是一个链表,只有在必要的时候,才有元素产生出来。

具体的关于消息队列的数据结构,可以参考相关的windows文档。

3.在Win32中,每一个线程有它自己专属的消息队列。

这并不意味着每一个窗口有它自己的消息队列,因为一个线程可以产生许多窗口。

如果一个线程停止回应,或是它忙于一段耗时的计算工作,那么由它产生的窗口统统都会停止回应,但系统中的其他窗口还会继续正常工作。

以下是一个非常基本的规则,用来管理Win32中的线程、消息、窗口的互动:所有传送给某一窗口之消息,将由产生该窗口之线程负责处理。

比方说,使用SetWindowText来更新一个Edit框的内容,其实就是发出了一个WM_SETTEXT 消息给edit窗口函数。

推而广之,每一个控件都是一个窗口,都拥有自己的窗口函数。

对窗口所作的一切事情基本上都会被该窗口的窗口函数处理,并因此被产生该窗口的线程处理。

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界⾯更新有关)1. Windows程序消息机制Windows GUI程序是基于消息机制的,有个主线程维护着消息泵。

这个消息泵让windows程序⽣⽣不息。

Windows程序有个消息队列,窗体上的所有消息是这个队列⾥⾯消息的最主要来源。

这⾥的While循环使⽤了GetMessage() 这个⽅法,这是个阻塞⽅法,也就是队列为空时⽅法就会阻塞,从⽽这个While循环停⽌运动,这避免了⼀个程序把cpu⽆缘⽆故的耗尽,让其他程序难以得到响应。

当然在某些需要cpu最⼤限度运动的程序⾥⾯就可以使⽤另外的⽅法,例如某些3d游戏或者及时战略游戏中,⼀般会使⽤PeekMessage()这个⽅法,它不会被windows阻塞,从⽽保证整个游戏的流畅和⽐较⾼的帧速。

(PeekMessage是⼀个Windows API函数。

该函数为⼀个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。

DispatchMessage功能是发送消息给窗⼝,窗⼝收到消息,执⾏事件)。

这个主线程维护着整个窗体以及上⾯的⼦控件。

当它得到⼀个消息,就会调⽤DispatchMessage()⽅法派遣消息,这会引起对窗体上的窗⼝过程的调⽤。

窗⼝过程⾥⾯当然是程序员提供的窗体数据更新代码和其它代码。

2. dotnet⾥⾯的消息循环public static void Main(string[] args){Form f = new Form();Application.Run(f);}Dotnet窗体程序封装了上述的while循环,这个循环就是通过Application.Run⽅法启动的。

3、线程外操作GUI控件的问题如果从另外⼀个线程操作windows窗体上的控件,就会和主线程产⽣竞争,造成不可预料的结果,甚⾄死锁。

因此windows GUI编程有⼀个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产⽣不可预料的结果。

Windows多线程及消息队列

Windows多线程及消息队列

Windows多线程及消息队列1.所谓的worker线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程。

2.微软的多线程模型:Win32说明文件一再强调线程分为GUI线程和worker线程两种。

GUI线程负责建造窗口以及处理主消息循环。

Worker负责执行纯粹的运算工作,如重新计算或重新编页等,这些运算工作会导致主线程的消息队列失去反应。

一般而言,GUI线程绝不会去做那些不能够马上完成的工作。

GUI线程的定义是:拥有消息队列的线程。

任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。

所有对此窗口的改变也都应该由该线程完成。

如果worker线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker线程摇身一变成了GUI线程。

这里的意思是:worker线程不能够产生窗口、对话框、消息框,或任何其他与UI有关的东西。

如果一个worker线程需要输入或输出错误信息,它应该授权给UI 线程来做,并且将结果通知给worker线程。

消息队列是一个链表,只有在必要的时候,才有元素产生出来。

具体的关于消息队列的数据结构,可以参考相关的windows文档。

3.在Win32中,每一个线程有它自己专属的消息队列。

这并不意味着每一个窗口有它自己的消息队列,因为一个线程可以产生许多窗口。

如果一个线程停止回应,或是它忙于一段耗时的计算工作,那么由它产生的窗口统统都会停止回应,但系统中的其他窗口还会继续正常工作。

以下是一个非常基本的规则,用来管理Win32中的线程、消息、窗口的互动:所有传送给某一窗口之消息,将由产生该窗口之线程负责处理。

比方说,使用SetWindowT ext来更新一个Edit框的内容,其实就是发出了一个WM_SETTEXT 消息给edit窗口函数。

推而广之,每一个控件都是一个窗口,都拥有自己的窗口函数。

对窗口所作的一切事情基本上都会被该窗口的窗口函数处理,并因此被产生该窗口的线程处理。

C#中使用Windows消息队列服务(MSMQ)简单示例

C#中使用Windows消息队列服务(MSMQ)简单示例
CreateMessageQueue(QueuePath); SendMessage(QueuePath, CreateMessage(richTextBox1.Text, formatter)); } private void button2_Click(object sender, EventArgs e) { System.Messaging.Message msg = ReceiveMessage(QueuePath); msg.Formatter = formatter; richTextBox2.Text = msg.Body.ToString(); } private System.Messaging.Message CreateMessage(string text, IMessageFormatter formatter) { System.Messaging.Message message = new System.Messaging.Message(); message.Body = text; message.Formatter = formatter; return message; } private void CreateMessageQueue(string queuePath) { if (!MessageQueue.Exists(queuePath)) {
就是不能跨语言比如java写的shardingjdbc显然不能用在c项目中所以携程的dal也要重新写一套c的客户端
C#中使用 Windows消息队列服务( MSMQ)简单示例
原创作品,允许转载,转载时请务必以超链接形式标明文章 、作者信息和本声明。否则将追究法律责任。
using System; using System.Collections.Generic; using ponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Messaging; namespace WindowsApplication1 {

windows消息队列数据结构c语言

windows消息队列数据结构c语言

Windows消息队列是一个用于进程间通信(IPC)的数据结构,它允许不同的进程通过发送和接收消息来进行通信。

在C语言中,可以使用Win32 API来创建和使用消息队列。

以下是一个简单的示例,展示了如何在C语言中使用Windows消息队列:c#include <windows.h>#include <stdio.h>// 定义消息队列名称#define QUEUE_NAME "MyMessageQueue"// 发送消息的函数void sendMessage(char* message) {HANDLE hQueue;// 打开或创建一个消息队列if (!(hQueue = CreateEvent(NULL, FALSE, FALSE, QUEUE_NAME))) {printf("Failed to create event\n");return;}// 将消息发送到队列中if (!PostEvent(hQueue, message)) {printf("Failed to post message\n");return;}// 关闭事件句柄CloseHandle(hQueue);}// 接收消息的函数char* receiveMessage() {HANDLE hQueue;// 打开或创建一个消息队列if (!(hQueue = CreateEvent(NULL, FALSE, FALSE, QUEUE_NAME))) {printf("Failed to create event\n");return NULL;}// 从队列中接收消息char* message = (char*)WaitForSingleObject(hQueue, INFINITE);// 关闭事件句柄CloseHandle(hQueue);return message;}int main() {char* message = receiveMessage();if (message) {printf("Received message: %s\n", message);// 释放消息内存LocalFree(message);} else {printf("Failed to receive message\n");}return 0;}这个示例代码演示了如何使用Windows消息队列来发送和接收消息。

msgget windows用法

msgget windows用法

msgget windows用法在Windows上,msgget函数是用于创建或打开消息队列的函数,消息队列的数量会受到系统消息队列数量的限制。

msgget函数的基本用法如下:首先,你需要包含所需的头文件。

这通常是“sys/”,这个头文件定义了用于消息队列的各种常量和函数。

然后,使用msgget函数创建一个或打开一个消息队列。

该函数的原型如下:int msgget(key_t key, int msgflg);参数解释如下:key:用于标识消息队列的键值。

可以使用IPC_PRIVATE作为键值来创建一个新的消息队列。

msgflg:标志位,用于指定消息队列的访问权限和属性。

可以使用的标志位包括IPC_CREAT、IPC_EXCL等。

调用msgget函数时,如果指定的消息队列不存在,并且标志位中指定了IPC_CREAT,则会创建一个新的消息队列。

如果消息队列已经存在,则返回错误。

一旦创建或打开消息队列成功,你就可以使用msgsnd函数向消息队列发送消息,使用msgrcv函数从消息队列接收消息,使用msgctl函数控制消息队列。

这些函数的原型如下:int msgsnd(int msqid, const void msgp, size_t msgsz, int msgflg);int msgrcv(int msqid, void msgp, size_t msgsz, long msgtyp, int msgflg);int msgctl(int msqid, int cmd, struct msqid_ds buf);以上是Windows上msgget函数的基本用法。

需要注意的是,Windows 上的消息队列与Unix/Linux上的消息队列有所不同,因此在编写跨平台的代码时需要注意差异。

windows xp 下安装消息队列时提示:无法启动MSMQ服务

windows xp 下安装消息队列时提示:无法启动MSMQ服务
msdtc -uninstall
msdtc - install
net start msdtc
执行了以上操作后,再安装消息队列就OK了!
错误代码:0x42c
错误描述:依存服务或组无法启动
这样的问题怎么解决呢?其实也不难,检查了一下自己的系统将windows messenger组件卸载了,导致msdtc服务也卸载了,可能就是这个原因造成的,先将这个组件安装再装消息队列就好了,或者只重新安装msdtc服务就行了:
开始--运பைடு நூலகம்--cmd
net stop msdtc
其实也不难检查了一下自己的系统将windowsmessenger组件卸载了导致msdtc服务也卸载了可能就是这个原因造成的先将这个组件安装再装消息队列就好了或者只重新安装msdtc服务就行了
windows xp下安装消息队列时提示:无法启动MSMQ服务
-
安装消息队列客户端安装失败
无法启动MSMQ服务

windows消息循环机制

windows消息循环机制

windows消息循环机制【Windows消息循环机制】Windows消息循环机制是指Windows中消息的发送、处理和接收机制。

它是Windows的核心机制,是窗口程序的基础。

Windows消息循环机制的核心是一组函数,包括GetMessage()、DispatchMessage()和PostMessage()等,它们涉及到消息的接收、传递和发送,编写Windows应用程序的时候必须使用这些函数。

首先介绍Windows消息循环机制的三个核心函数:GetMessage():它是消息的接收函数,用于从消息队列中获取消息,该函数会将消息放到一个消息结构体中,并且在收到WM_QUIT消息时,会返回一个非零值。

PostMessage():它是消息的发送函数,用于将消息发送到消息队列中,可以将消息发送到本进程,也可以将消息发送到其他进程。

DispatchMessage():它是消息的处理函数,用于将收到的消息按照指定的规则进行处理,它会调用相应的消息处理函数,并传入相关参数,以便处理。

Windows消息循环主要由一个循环结构构成,该循环由GetMessage函数和DispatchMessage函数构成,具体的循环结构如下:while (GetMessage (&Msg, NULL, 0, 0) > 0){TranslateMessage(&Msg);DispatchMessage(&Msg);}上面的循环由两个函数组成,GetMessage函数会从消息队列中获取消息,并将消息放入一个消息结构体中,当获取到WM_QUIT消息时,该函数会返回一个非零值,从而跳出循环。

而DispatchMessage 函数则会根据收到的消息调用相应的消息处理函数,来处理收到的消息。

以上就是Windows消息循环机制的基本概念和实现原理,Windows消息循环机制的理解对于编写Windows应用程序非常重要,因此要掌握和理解Windows消息循环机制的原理。

Windows窗口消息机制简介

Windows窗口消息机制简介

从图中可以看出,Windows维护着一个全局系统消息队列,外界的一切动作变化,都首先以消息的形式传入到系统消息队列中。

Windows 又为每一个应用程序维护着一个属于单个应用程序的消息队列,Windows会对系统消息队列中的消息进行筛选,将属于某个应用程序的消息分配到对应的应用程序消息队列中。

无论是系统消息队列,还是应用程序的消息队列,全部都是在Windows的控制下,应用程序通过GetMessage系统调用从Windows 管辖的相对应的应用程序消息队列中取得消息,并进行处理。

从图中可以看出,通过GetMessage取得消息,有一个从用户态到内核态的过程。

因为能操作消息队列的,只有Windows自己。

应用程序取得消息之后,对消息进行简单的处理(TranslateMessage)后,通过DispatchMessage系统调用将消息返还给Windows,再由Windows以该消息为参数,调用应用程序的窗口过程函数。

也就是说,应用程序的窗口过程不是由应用程序自己直接调用的,而是通过Windows系统间接调用的。

应用程序的窗口过程之所以要由Windows来调用,而不是应用程序亲自调用,主要是因为下面几点原因:1.一个应用程序可能会有多个窗口,不同窗口的消息应该发给不同的窗口过程,如果这个过程由应用程序自己来管理的话,会给编程带来很大的难度。

2.其它的应用程序可能会通过SendMessage系统调用直接将消息通过Windows发给应用程序的窗口过程3.Windows并不是将所有的消息都放入到应用程序的消息队列中,一些紧急的消息,Windows会直接调用应用程序的窗口过程。

图中还有关于postMessage和sendMessage的介绍:postMessage是由其它应用程序调用,将消息放入到应用程序的消息队列中。

sendMessage是由其它应用程序调用,将消息直接发送大应用程序的窗口过程。

这两个方法同样都是通过Windows系统操作应用程序的窗口过程^_^。

windows消息机制的工作原理

windows消息机制的工作原理

windows消息机制的工作原理Windows 消息机制是一种用于进程间通信的机制,它通过消息队列将消息发送给目标进程并进行处理。

本文将介绍Windows消息机制的工作原理。

1. 消息队列在Windows操作系统中,每个窗口都有一个与之关联的消息队列。

消息队列是一个先进先出的队列,用于存储发送给窗口的消息。

当有消息发送给窗口时,消息会被添加到消息队列的末尾。

2. 消息循环每个窗口都有一个消息循环,它负责从消息队列中取出消息并进行处理。

消息循环是一个无限循环,不断地从消息队列中取出消息并分发给窗口的回调函数进行处理。

消息循环的伪代码如下所示:```while (GetMessage(&msg, hWnd, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}```在每次循环中,GetMessage函数会从消息队列中取出一个消息。

TranslateMessage函数用于将消息转换为键盘消息,以便处理键盘输入。

DispatchMessage函数负责将消息分发给窗口的回调函数。

3. 消息处理窗口的回调函数(也称为窗口过程)是用于处理消息的函数。

每个窗口都有一个唯一的回调函数,当接收到消息时,回调函数会根据消息类型进行相应的处理。

根据消息的不同,回调函数可以执行一系列操作,例如绘制窗口、响应用户输入等。

4. 消息参数每个消息包含一些参数,用于指定消息的类型和详细信息。

常见的消息参数包括消息类型(例如WM_CREATE、WM_PAINT等)、消息源(例如来自哪个窗口或控件)、消息的附加参数(例如鼠标点击的位置)等。

回调函数根据这些参数来判断如何处理消息。

5. 消息处理顺序Windows消息机制采用先到先服务的原则,即先发送的消息先处理。

当消息循环从消息队列中取出消息时,会按照消息的先后顺序进行处理,确保消息的有序性。

这意味着发送给窗口的消息将按照发送的顺序被处理。

windows消息机制工作原理

windows消息机制工作原理

windows消息机制工作原理
Windows消息机制是Windows操作系统中的核心特性之一,它允许不同的应用程序之间进行通信和交互。

当一个应用程序需要与另一个应用程序进行交互时,它可以发送一个消息到目标应用程序。

目标应用程序会接收这个消息并做出相应的处理。

Windows消息机制的工作原理可以分为以下几个步骤:
1. 发送消息:当一个应用程序需要发送消息到另一个应用程序时,它会调用Windows API中的SendMessage函数或者PostMessage函数。

这些函数会将消息传递给操作系统内核,并将消息发送到目标应用程序的消息队列中。

2. 消息队列:每个应用程序都有一个消息队列,它用于存储来自其他应用程序的消息。

Windows操作系统会在后台自动地维护这些消息队列,并当应用程序准备好时通知它们有新的消息到达。

3. 消息循环:每个应用程序都有一个消息循环,它用于获取来自消息队列的消息并将其传递给相应的消息处理程序。

当操作系统通知应用程序有新的消息到达时,应用程序会从消息队列中获取消息并将其传递给消息循环。

4. 处理消息:每个应用程序都有一个消息处理程序,它用于处理来自其他应用程序的消息。

当消息循环从消息队列中获取到消息时,它会将消息传递给相应的
消息处理程序进行处理。

总之,Windows消息机制利用了操作系统层面的消息队列和消息循环来实现应用程序之间的通信和交互。

这种机制可以帮助开发者实现非常灵活的应用程序,并且非常适合多任务处理和多线程应用。

基于windows消息队列的功能自动化测试方法研究

基于windows消息队列的功能自动化测试方法研究

• 105•测试是每个软件项目中必不可少的环节。

在旁人的眼中,测试就是模拟用户使用软件功能,并且发现功能缺陷的录制脚本、修改增强脚本、调试脚本、回放脚本和脚本维护。

当我们在自己封装的组件上使用QTP 录制脚本后,再回放,经常发现回基于windows消息队列的功能自动化测试方法研究卡斯柯信号有限公司 王 惠 朱华波 朱程辉一个过程。

不可否认,对于图形用户界面GUI (Graphical User Interface )而言,黑盒测试确实如此,但是看似简单的环节,往往会花费较多的时间。

主要原因有二点:第一,图形用户界面GUI 的灵活性较大,使用过程中可能会出现多种场景,甚至是无法穷尽的场景。

第二,图形用户界面GUI 提供给用户的一般是鼠标和键盘的操作,现有的商用自动化测试工具只能识别标准的windows 组件,对于企业自己封装的组件是无法自动识别的,而企业因为业务的需要往往需要封装属于自己的组件,因此图形用户界面GUI 的自动化率不高。

因此,本文将主要研究如何实现企业自主封装组件的自动化测试。

1 现状随着软件应用领域的不断扩大,迫使越来越多的人开始接触软件,而软件的质量直接决定了用户的体验。

因此,为了第一时间抓住客户,企业越来越重视软件的质量。

提高软件质量的最直接的途径,就是在测试过程中,尽可能多地覆盖软件使用过程中可能出现的场景。

可是对于每个项目而言,测试时间是有限的,为了提高效率,必然要引入图形用户界面GUI 的自动化测试,提高自动化率,既能实现场景的高度覆盖,又可以保证项目的发布节点。

目前商用的GUI 测试工具有很多,包括QTP 、Winrunner 、AutoRunner 、TestCenter 等。

开源的工具包括Jmeter 、OpenSTA 、Selenium 、TPTEST 等。

本文以QTP 为例,如果使用QTP 进行GUI 的自动化测试,一般的步骤是准备测试用例、图1 SPY++窗口列表(a)保存按钮窗口层级状态图 (b)记事本窗口层级图图2• 106•放的实际效果与预期效果不一致。

微软-消息队列-MSMQ

微软-消息队列-MSMQ

private void BindProtecotrList(string DeRoomID){dropProtectorList.Items.Clear();CommonMethod.BindDropDownList("ProtectorName", "ProtectorID", dropProtectorList, HistoryDataBll.GetProtecotrData("", string.Format("ANDcd.DeRoomID = {0}", DeRoomID)), true);}tcs 17:11:23if (dropDeviceName.Items.Count > 0){BindProtecotrList(dropDeviceName.Items[0].Value);}tcs 17:11:33if (conSwitch){BindProtecotrList(dropDeviceName.SelectedItem.Value);}利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。

消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。

MSMQ与XML Web Services和.Net Remoting一样,是一种分布式开发技术。

但是在使用XML Web Services或.Net Remoting组件时,Client端需要和Server 端实时交换信息,Server需要保持联机。

MSMQ则可以在Server离线的情况下工作,将Message临时保存在Client端的消息队列中,以后联机时再发送到Server 端处理。

显然,MSMQ不适合于Client需要Server端及时响应的这种情况,MSMQ以异步的方式和Server端交互,不用担心等待Server端的长时间处理过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因为窗口过程是由所有属于同类窗口共享的,所以它能处理几个不同窗口的消息,要识别受消息影响的某个窗口,窗口过程可以检查消息所带的窗口句柄。有关窗口过程,参见“窗口过程”。
传递和发送消息
任何应用程序都能投递和发送消息,就跟系统一样,应用程序投递一条消息是通过把它复制到消息队列,发送消息则是通过把消息数据作为窗门过程的参数。要投递消息,应用程序需要用到函数PoendMessage, BroadcastSystemMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage或SendDlgItemMessage。
消息
windows系统以消息的形式把输入传给窗口过程,消息是由windows系统或应用程序产生的.windows系统对每一个输入事件都要产生消息,例如,用户按键盘、移动鼠标或单击一个滚动条控制框。windows系统为了响应应用程序给系统带来的变化也会产生消息,比如应用程序改变了系统字体资源池或是改变了一个窗门的大小。应用程序可通过产生消息指导它自己的窗口来完成某个任务,或是与其它应用程序的窗口进行通信。
应用程序是调用函数SendMessage、SendNotifyMessage或SendDlgItemMessage发送消息的。
消息处理
应用程序必须删除和处理投递到它的线程消息队列中的消息,单一线程的应用程序一般是在它的WinMain函数中使用一个消息循环来删除消息,并把消息发送到相应的窗口过程进行处理。具有多重线程的应用程序在创建窗口的每一个线程中使用一个消息循环,下一节将讲述消息循环是如何工作的,另外还解释了窗口过程的一般规则。
windows消息队列
一节详细描述消息和消息队列以及如何在你程序中使用他们。
关于消息和消息队列
与传统的应用程序不同,Microsoft Windows应用程序并不显式地用一个函数的调用(如c运行库)来获取输入,而是,等待windows系统把输入传给它们。
windows系统把应用程序的所有输入传给应用程序的窗口,每个窗口都有一个称之为窗口过程的函数.当窗口有输入时windows系统要调用它,窗口过程处理输入并把控制返回windows系统。有关窗口过程,参见“窗口过程”。这一章讲述消息及消息队列,并说明在应用程序中如何使用它们。
系统通过把消息数据作为过程的参数来向窗口过程发送消息,再由窗口过程完成与消息相应的活动。它需要检查消息的标识,在处理消息时要使用由消息参数指定的这个信息。
窗口过程一般不会忽略—条消息,如果它不处理某条消息,它就必须把这条消息传回系统进行默认处理,窗口过程是调用函数DefWindowProc来完成的,由它完成一个默认的操作并返回消息结果。绝大多数窗口过程只处理几种类型的消息,其它的则通过调用DefWindowProc传给了系统。
WM_PAINT消息有点特别,windows系统总是把这条消息放在消息队列的最后,这样可保证窗口按先进先出次序接收它的输入消息,WM_PAINT消息被保持在队列中,只有在队列中没有其它消息时才发送到窗口过程。同一个窗口的多个WM_PAINT消息被合并成一个WM_PAINT消息,把客户区所有无效部分合并成一个区域.合并WM_PAINT消息节约了窗口必须重画客户区内容的时间。
windows系统把消息发送给窗口过程.窗口过程有四个参数:窗口句柄、消息标识以及两个叫做消息参数的32位值。窗口句柄决定消息将发送到哪—个窗口,windows系统则用它来确定向哪一个窗口过程发送消息。
消息标识是一个命名的常量,由它来标明消息的目的。如果窗口过程接收到一条消息,它就通过消息标识来决定如何处理这条消息。例如,消息标识WM_PAINT通知窗口过程,窗口的客户区被改变了,需要重画。
一个线程可以用函数WaitMessage当他没有其他消息在其队列里时,产生对其他线程的控制。此函数将终止线程,直到一个新消息被放入该线程的消息队列里,然后返回。
你可以调用函数SetMessageExtraInfo来设置当前线程消息队列的附加信息。是和当前线程的消息队列联系的32位值。用户可以用函数GetMessageExtraInfo来获得附加信息,该信息将会保留到下次调用函数GetMessage或PeekMessage之前。
系统向线程消息队列投递消息是通过填充一个MSG结构,再把它复制到消息队列中,MSG结构中的信息包括接收消息的窗口句柄、消息标识、两个消息参数、消息时间以及鼠标的位置,线程可把消息投递到它自己的消息队列中或是通过函数PostMessage和PostThreadMessage把消息投递到其它线程的队列中去。
排队消息
windows系统在同一时间可显示多个窗口,要发送鼠标和键盘输入到相应的窗口,windows系统要用到消息队列,它要管理一个系统消息队列和任意数目线程消息队列,每一个队列对应于一个线程。
不管什么时候,只要用户移动鼠标或是敲键盘.鼠标或键盘的设备驱动器都要把输入转换成消息,并把它们放到系统消息队列中去。windows从系统队列中每次移走一条消息,确定目的窗口,再把它们投递到创建目的窗口的线程的消息队列中,线程消息队列接收所有由该线程创建的窗口的鼠标和键盘消息。线程从它的队列中移走消息并指导windows系统将它们发送到相应的窗口过程进行处理。有关线程,参见“进程和线程”。
非队列消息
非队列消息是直接发送到目标窗口过程的,而不通过系统消息队列和线程消息队列。windows系统一般通过发送非队列消息把影响某窗口的事件通知窗口。例如,如果用户激活一个新的应用程序窗口.windows系统就会向该窗口发送一系列的消息,包括:WM_ACTIVATE,WM_SETFOCUS和WM_SETCURSOR,这些消息分别通知窗口:它被激活了;将通过这个窗口进行键盘输入;鼠标已移到这个窗口边框的里面了。非队列消息也有可能发生在应用程序调用一个windows系统函数时,例如,在应用程序用函数SetWindowPos来移动一个窗口之后,windows系统发送一条WM_WINDOWPOSCHANGED消息。
函数DispatchMessage把消息发送到与MSG结构中指定的窗口句柄相应的窗口过程,如果窗口句柄是HWND_TOPMOST ,DispatchMessage就把消息发送到系统中所有顶层窗口的窗口过程。如果窗口句柄是NULL,对于这条消息DispatchMessage则什么也不做。
应用程序的主线程在初始化应用程序并且至少创建了一个窗口之后就开始了消息循环,一旦开始,消息循环就连续不断地从线程的消息队列中校取消息并把它们分发到相应的窗口,函数GetMessage从消息队列中检取到WM_QUIT消息时,消息循环就结束了。
消息循环
一个简单的消息循环含有一个对下列函数的调用:GetMessage, TranslateMessage和DispatchMessage。函数GetMessage从队列中检取一条消息并把它复制到一个MSG结构中.GetMessage应返回TRUE,但如果它得到的是WM_QUIT消息,它就返回FALSE并结束循环。在单一线程的应用程序中,结束消息循环通常是关闭应用程序的第一步。一般在应用程序主窗口的窗口过程中响应WM_DESTROY消息时,应用程序通过函数PostQuitMessage关闭它自己的消息循环。
消息参数指定窗口过程在处理消息时所用的数据或数据的位置,消息的意图及数值取决了消息本身。消息参数可以是一个整数、紧缩的位标志、一个含有附加数据结构的指针等等。如果消息不使用消息参数,一般就都设置成NULL、窗口过程必须检查消息标识以确定如何解释消息参数。
消息路由
windows系统用两种方式向窗口过程发送消息:把消息投递到一个先进先出的消息队列中,它是一个系统定义的内存块用于临时存储消息;或是把消息直接发给窗口过程。
应用程序可通过函数GetMessage从它的队列中移走一条消息,应用程序还可用函数PeekMessage来检查队列中的某个消息但并不移走它,这个函数用有关这条消息的信息填充MSG结构。
把一条消息从它的队列中移走后.应用程序可用函数DispatchMessage指导windows系统把这条消息发送到窗口过程进行处理。DispatchMessage利用前面调用函数GetMessage或PeekMessage时填充的MSG结构的指针,把窗口句柄、消息标识及两个消息参数传给窗口过程,但它并不传送时间或鼠标光标的位置.应用程序可以在处理一条消息时,通过调用函数GetMessageTime和GetMessagePos来获取这些信息。
使用键盘加速键的应用程序必须能够把键盘消息转换成命令消息,要这样做,应用程序的消息循环必须调用函数TranslateAccelerator有关加速键,参见“键盘加速键”。
窗口过程
窗口过程是一个函数,用来接收和处理所有发送到该窗口的消息,每个窗口类都有一个窗口过程,同一窗口类所创建的窗口共用同一个窗口过程来响应消息。
投递到消息队列中的消息叫排队消息,它们主要是用户通过鼠标或键盘的输入结果.如WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, and WM_CHAR消息。其它的排队消息包括定时器、绘制和退出消息:WM_TIMER, WM_PAINT, and WM_QUIT。所有直接发送到窗口过程的其它消息称之为非队列消息。
如果在GetMessage中指定窗口句柄,那么从队列中检取的只是指定窗口的消息。GetMessage也能过滤队列中的消息,这种情况下检取的只是指定范围内的消息。有关过滤消息,参见“消息过滤”。
如果某个线程想接收键盘的字符输入,那么线程消息循环中必须含有TranslateMessage。Windows系统在用户每按一次键时会产生一个虚键消息(WM_KEYDOWN和WM_KEYUP),虚键消息含有一个标识哪一个键被按过的虚键码,但不是它的字符值,要得到这个值,消息循环中必须含有TranslateMessage,由它来把虚键消息翻译成字符消息(WM_CHAR),再把它放回到应用程序的消息队列中去.这样字符消息才能在消息循环的下一轮循环中被发送到窗口过程。
相关文档
最新文档