reactos操作系统实现(174)
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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |