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}
原文链接:https://www.f2er.com/react/308347.html