1、个人感觉:

  1.1、MSDN中(https://msdn.microsoft.com/en-us/library/ms684242.aspx),说:

dwWakeMask [in]

  The input types for which an input event object handle will be added to the array of object handles.

    ZC: 也就是说,会在 "event object handle"数组的最后 加入一个 事件对象句柄,这个 事件对象句柄 专门用于响应消息的。这里 我将它称为 "消息事件对象句柄"(它对应的对象就称为"消息事件对象")

  1.1、MSDN中(https://msdn.microsoft.com/en-us/library/ms684242.aspx),说:

The QS_ALLPOSTMESSAGE and QS_POSTMESSAGE flags differ in when they are cleared. QS_POSTMESSAGE is cleared when you call GetMessage or PeekMessage, whether or not you are filtering messages. QS_ALLPOSTMESSAGE is cleared when you call GetMessage or PeekMessage without filtering messages (wMsgFilterMin and wMsgFilterMax are 0). This can be useful when you call PeekMessage multiple times to get messages in different ranges.

    文中多次提到 "cleared",这里指  "消息事件对象"的状态。

    ZC: 我做的测试结果:

      QS_ALLPOSTMESSAGE : 只要消息不取走,"消息事件对象"就一直是 有信号的状态(不管是否过滤消息(GetMessage和PeekMessage函数的wMsgFilterMin和wMsgFilterMax参数))。消息被取走后,"消息事件对象" 才会变成 无信号状态。

      QS_POSTMESSAGE:就算消息不取走,"消息事件对象" 还是会被设置成 无信号状态。未取走的消息还保留在消息队列中。

2、

3、Delphi

  3.1、界面:

  3.2、代码:

procedure TfrmMain.btnPost1000Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnPost1001Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnSend1001Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnPostCloseClick(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_CLOSE, , );
end; procedure TfrmMain.btnSetEventClick(Sender: TObject);
var hEvent :Cardinal;
iErr :integer;
begin
hEvent := OpenEvent(EVENT_ALL_ACCESS, false, '__VC_MsgWaitForMultipleObjects_TEST_20180105__');
iErr := GetLastError;
Memo1.Lines.Add('OpenEvent return : '+IntToStr(hEvent)+', GetLastError : '+inttostr(iErr)); SetEvent(hEvent); CloseHandle(hEvent);
end; procedure TfrmMain.btnPost1100Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnSend1100Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_USER+, , );
end;

4、VC6 测试代码:

#include <windows.h>

#include <io.h>
#include <fcntl.h>
#include <stdio.h> HINSTANCE g_hInstance = ;
HWND g_hWnd = ; LRESULT CALLBACK ProcWindow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void InitConsoleWindow()
{
AllocConsole();
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long)handle,_O_TEXT);
FILE * hf = _fdopen( hCrt, "w" );
*stdout = *hf;
} //////////// //////////// //////////// //////////// //////////// //////////// int WINAPI WinMain(
HINSTANCE _hInstance, // 当前 hInstance句柄
HINSTANCE _hPrevInstance, // 之前的 hInstance句柄
LPSTR _lpCmdLine, // 命令行
int _nCmdShow // 显示状态
)
{
g_hInstance = _hInstance; // 程序(.exe)的图标貌似默认是 资源文件中 的第一个图标??
WNDCLASS wndcls = {};
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ProcWindow;
wndcls.cbClsExtra = ;
wndcls.cbWndExtra = ;
wndcls.hInstance = _hInstance;
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); // 窗口图标
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
wndcls.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景画刷
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName= "zc20110929";
// 注册窗口类
RegisterClass(&wndcls); g_hWnd = CreateWindowEx(
NULL, //WS_EX_CLIENTEDGE,
wndcls.lpszClassName,
"ZC Window",
WS_OVERLAPPEDWINDOW,
, ,
, ,
NULL,
NULL, //g_hMenu,
_hInstance,
NULL); ShowWindow(g_hWnd, SW_SHOWNORMAL);
UpdateWindow(g_hWnd); MSG msg;
while(GetMessage(&msg, , , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} HANDLE g_hEvent = NULL;
//#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE) << 16) int g_iInc = ; LRESULT CALLBACK ProcWindow(
HWND _hWnd, // 窗口句柄
UINT _uMsg, // 消息ID(identifier)
WPARAM _wParam,
LPARAM _lParam)
{
switch (_uMsg)
{
case WM_USER+:
{
printf("Before MsgWaitForMultipleObjects .\n");
//DWORD dwRtn = MsgWaitForMultipleObjects(1, &g_hEvent, false, INFINITE, QS_SENDMESSAGE);
while ()
{
DWORD dwRtn = MsgWaitForMultipleObjects(, &g_hEvent, false, INFINITE, QS_SENDMESSAGE | QS_POSTMESSAGE);
if (dwRtn == )
break;
printf("MsgWaitForMultipleObjects return %d\n", dwRtn);
/*MSG msg;
::GetMessage(&msg, _hWnd, 2024, 2026);
printf("GetMessage get message : %d\n", msg.message);*/
MSG msg;
//dwRtn = ::PeekMessage(&msg, _hWnd, 2024, 2026, PM_REMOVE | PM_QS_POSTMESSAGE);// PM_QS_POSTMESSAGE
//dwRtn = ::PeekMessage(&msg, _hWnd, 2024, 2026, PM_QS_POSTMESSAGE);// PM_QS_POSTMESSAGE
//printf("PeekMessage get message(1) : %d, %d\n", msg.message, dwRtn);
dwRtn = ::PeekMessage(&msg, _hWnd, , , PM_NOREMOVE | PM_QS_POSTMESSAGE);
printf("PeekMessage get message(2) : %d, %d\n", msg.message, dwRtn);
if (msg.message == WM_CLOSE)
break; if (g_iInc == )
{
::GetMessage(&msg, _hWnd, , );
printf("GetMessage get message : %d\n", msg.message);
}
g_iInc ++;
printf("\t ==> %d\n", g_iInc);
if (g_iInc >= )
{//*
// system("pause");
::GetMessage(&msg, _hWnd, , );
printf("GetMessage get message : %d\n", msg.message);
// ::MessageBox(0, "Text", "caption", 0);
//*/
break;
}
}
/* DWORD WINAPI MsgWaitForMultipleObjects(
_In_ DWORD nCount,
_In_ const HANDLE *pHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds,
_In_ DWORD dwWakeMask
);*/
printf("After MsgWaitForMultipleObjects .\n");
return ;
}
case WM_USER+:
{
printf("WM_USER+1001\n");
return ;
}
case WM_USER+:
{
printf("WM_USER+1100\n");
return ;
}
case WM_CREATE:
{
InitConsoleWindow();
printf("WM_CREATE\n");
g_hEvent = ::CreateEvent(NULL, false, false, "__VC_MsgWaitForMultipleObjects_TEST_20180105__");
printf("HWND : %d , 0x%X\n", _hWnd, _hWnd);
return ;
}
case WM_PAINT:
{
char buf[] = {};
sprintf(buf, "HWND : %d , 0x%08X", _hWnd, _hWnd); HDC hDc;
PAINTSTRUCT ps;
hDc = BeginPaint(_hWnd, &ps);
TextOut(hDc, , , buf, strlen(buf));
EndPaint(_hWnd, &ps);
return ;
// break;
}
case WM_CLOSE:
case WM_DESTROY:
{
DestroyWindow(_hWnd);
PostQuitMessage();
return ;
}
}
return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
}

5、

MsgWaitForMultipleObjects_测试的更多相关文章

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  4. TechEmpower 13轮测试中的ASP.NET Core性能测试

    应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...

  5. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  6. 渗透测试工具BurpSuite做网站的安全测试(基础版)

    渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...

  7. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  8. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  9. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

随机推荐

  1. EL和jstl(概念和使用方法)

    概念: 1 .  JSP 标签 是用来替换java代码的技术,容器遇到标签后会将其转换成java代码,jsp标签类似于开始标记.属性.结束标记.标签体. EL表达式是一套简单的运算规则,用于给jsp标 ...

  2. itchat key

    http://www.php.cn/python-tutorials-394725.html

  3. curl命令基本使用小总结

    curl 下载文件 -o:将文件保存为命令行中指定的文件名的文件中 -O:使用URL中默认的文件名保存文件到本地 --limit-rate:限速 -C:对大文件使用断点续传功能 --silent:不显 ...

  4. Golang的值类型和引用类型的范围、存储区域、区别

    常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...

  5. python pip

    如果pip的版本较低,可能导致pip时安装出错,所以我们要更新pip版本-- 查询pip版本 pip -V -- Linux and OS X 升级 pip install -U pip -- Win ...

  6. SVN更新无数次后仍显示Out of date

    理器相集成的TortoiseSVN更是方便. 但有时候在提交修改后的文件时,却莫名其妙的出现out of date错误,导致工程无法commit,即使将新文件删了重新update,然后再在旧文件上作修 ...

  7. MySQL乐观锁和悲观锁的概念和原理

    乐观锁:在取数据时不加锁,等处理完逻辑的时候,查看是否与上一次相同,若相同则更新,若不同则拒绝. 悲观锁:在取数据时就加上锁,只有更新完数据之后,别的用户才可以进行读. (个人总结)

  8. Quick Find (QF)

    Quick Find 顾名思义就是快速查找,构建一个数组,通过下标即可迅速查找其id Union and Find:构建一个数组,下标为索引,数组元素的值为其id,初始id和索引相同 Union(p, ...

  9. socket之 select模型

    前段时间一直想学习网络编程的select模型,看了<windows网络编程>的介绍,参考了别人的博客. 这里的资料主要来自http://www.cnblogs.com/RascallySn ...

  10. javaScript中ajax、axios总结

    一.原生js实现ajax请求: 步骤: get请求: // 1.创建一个XMLHttpRequest的对象. var xml=null; //初始值设为空 if(XMLHttpRequest){ xm ...