DispatchMessage 函数干了啥?

来源:互联网 发布:昆山远洋数据 编辑:程序博客网 时间:2024/04/27 16:35

DispatchMessage函数主要分发一个消息给窗口处理函数。具体实现代码如下:

#001  LRESULT WINAPI

#002  DispatchMessageW(CONST MSG *lpmsg)

#003  {

#004      LRESULT Ret = 0;

#005      PWINDOW Wnd;

#006 

 

检查是否有窗口,如果有窗口,再判断窗口是否有效。

#007      if (lpmsg->hwnd != NULL)

#008      {

 

检查窗口的句柄是否有效。

#009          Wnd = ValidateHwnd(lpmsg->hwnd);

#010          if (!Wnd || SharedPtrToUser(Wnd->ti) != GetW32ThreadInfo())

#011              return 0;

#012      }

#013      else

#014          Wnd = NULL;

#015 

 

定时器消息处理。

#016      if ((lpmsg->message == WM_TIMER || lpmsg->message == WM_SYSTIMER) && lpmsg->lParam != 0)

#017      {

 

获取定时消息处理的过程函数。

#018          WNDPROC WndProc = (WNDPROC)lpmsg->lParam;

#019 

 

如果是系统的定时消息,就调用NtUserDispatchMessage函数。

#020          if ( lpmsg->message == WM_SYSTIMER )

#021             return NtUserDispatchMessage( (PMSG) lpmsg );

#022 

 

这里调用应用程序自定义的定时器函数。

#023          Ret = WndProc(lpmsg->hwnd,

#024                        lpmsg->message,

#025                        lpmsg->wParam,

#026                        GetTickCount());

#027      }

#028      else if (Wnd != NULL)

#029      {

 

如果窗口句柄不为空,说明都是窗口消息。

#030         // FIXME Need to test for calling proc inside win32k!

#031         if ( (lpmsg->message != WM_PAINT) ) // && !(Wnd->flags & W32K_CALLPROC) )

#032         {

 

调函数IntCallMessageProc处理窗口消息。

#033             Ret = IntCallMessageProc(Wnd,

#034                                      lpmsg->hwnd,

#035                                      lpmsg->message,

#036                                      lpmsg->wParam,

#037                                      lpmsg->lParam,

#038                                      FALSE);

#039         }

#040         else

 

这里调用NtUserDispatchMessage处理窗口消息。

#041           Ret = NtUserDispatchMessage( (PMSG) lpmsg );

#042      }

#043 

#044      return Ret;

#045  }

原创粉丝点击