windows消息机制,关于windows的消息机制下列说法正确的

  windows消息机制,关于windows的消息机制下列说法正确的

  3.一种具有窗口和窗口过程功能但没有消息循环的程序

  一个程序,如果我们创建了一个窗口,也定义了窗口过程函数,但是如果我们没有建立消息循环会怎么样?我们在win32控制台项目下编写以下代码:

  #包含windows.h

  #定义WM_TEST 10000

  LRESULT回调WndProc(HWND,UINT,WPARAM,LPARAM);

  void main()

  静态TCHAR szapname[]=TEXT( Test!);

  HWND hwnd

  wnd class wnd class={ NULL };

  wndclass.lpfnWndProc=WndProc

  wnd class . style=CS _ HREDRAW CS _ VREDRAW;

  wnd class . lpszclassname=SZ appname;

  register class(wnd class);

  hwnd=CreateWindow(szAppName,

  文本(“测试程序”),

  WS_OVERLAPPEDWINDOW,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  空,

  空,

  空,

  NULL);

  ShowWindow(hwnd,SW _ SHOW);

  更新窗口(hwnd);

  系统(“暂停”);

  }

  这是一个简单的win32窗口程序,但是我们没有在窗口过程函数WndProc中定义WN_PAINT消息的处理,也没有在main函数中创建窗口后建立消息循环。运行程序后会发生什么?

  发现该窗口实际上是被创建的。但是当鼠标上移的时候,会发现形态就像假死一样没有反应。这是因为包括自画消息WM_PAINT在内的所有消息都放在线程的消息队列中,但是我们没有消息循环!我们没有把消息队列里的消息拿出来,更不用说处理了。我们甚至没有窗口进程中WM_PAINT对应的消息处理功能。界面自然地假装死亡。

  4.4之间的另一个区别。发送消息和邮件消息

  之前写了一篇博文说SendMessage和PostMessage的区别是,SendMessage在消息被处理后才会返回。如果在调用SendMessage后没有处理该消息,SendMessage将被阻止,直到它被处理。PostMessage不会阻塞,直接返回处理结果。其实两者还有一个区别:PostMessage发送的消息会进入消息队列进行提取,而SendMessage发送的消息不会进入消息队列,直接交给窗口过程函数进行处理。为了验证这一说法,我们编写了以下代码:

  #包含windows.h

  #定义WM_TEST 10000

  LRESULT回调WndProc(HWND,UINT,WPARAM,LPARAM);

  void main()

  静态TCHAR szapname[]=TEXT( Test!);

  HWND hwnd

  wnd class wnd class={ NULL };

  wndclass.lpfnWndProc=WndProc

  wnd class . style=CS _ HREDRAW CS _ VREDRAW;

  wnd class . lpszclassname=SZ appname;

  register class(wnd class);

  hwnd=CreateWindow(szAppName,

  文本(“测试程序”),

  WS_OVERLAPPEDWINDOW,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  CW_USEDEFAULT,

  空,

  空,

  空,

  NULL);

  ShowWindow(hwnd,SW _ SHOW);

  更新窗口(hwnd);

  int i=SendMessage(hwnd,WM_TEST,NULL,NULL);

  系统(“暂停”);

  }

  创建窗口后,我们用SendMessage发送了一条定制消息WM_TEST。在窗口过程函数WndProc中,我们定义了WM_TEST的处理方法是弹出一个MessageBox,返回50。

  运行后发现,即使我们创建的表单仍然处于假死状态,MessageBox仍然会弹出,SendMessage的返回值I为50。说明窗口过程函数WndProc中定义的WM_TEST报文的处理代码执行成功!注意,在我们的程序中没有消息循环,但是我们用SendMessage发送的消息仍然由窗口过程函数WndProc处理。

  让我们将SendMessage更改为PostMessage,然后重试。运行后发现消息框没有弹出来。为什么?因为PostMessage发送的消息是要进入消息队列的,但是我们没有消息循环,没有使用GetMessage这样的函数从消息队列中获取消息,也没有使用DispatchMessage分发消息,所以PostMessage发送的WM_TEST仍然在消息队列中等待。不执行窗口函数WndProc中的代码。

  这就证明了SendMessage和PostMessage的另一个区别:SendMessage发送的消息直接交给相应的窗口过程函数进行处理,而不是进入消息队列,而PostMessage发送的消息却要进入消息队列进行分发和处理。

windows消息机制,关于windows的消息机制下列说法正确的