加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(168)

发布时间:2020-12-15 04:58:54 所属栏目:百科 来源:网络整理
导读:当应用程序更新窗口后,就需要不断地接收系统发过来的消息,然后处理消息,最后发送消息出去,这样就构成了应用程序的消息循环处理。不断地获取系统消息的函数是 GetMessage 函数,下面就是它的实现代码: #001 BOOL WINAPI #002 GetMessageW(LPMSG lpMsg, #

当应用程序更新窗口后,就需要不断地接收系统发过来的消息,然后处理消息,最后发送消息出去,这样就构成了应用程序的消息循环处理。不断地获取系统消息的函数是GetMessage函数,下面就是它的实现代码:

#001 BOOL WINAPI

#002 GetMessageW(LPMSG lpMsg,

#003 HWND hWnd,

#004 UINT wMsgFilterMin,

#005 UINT wMsgFilterMax)

#006 {

#007 BOOL Res;

#008 MSGCONVERSION Conversion;

#009 NTUSERGETMESSAGEINFO Info;

获取线程相关的数据。

#010 PUSER32_THREAD_DATA ThreadData = User32GetThreadData();

#011

消息转换清除。

#012 MsgConversionCleanup(lpMsg,FALSE,NULL);

调用函数NtUserGetMessage来获取窗口的消息。

#013 Res = NtUserGetMessage(&Info,hWnd,wMsgFilterMin,wMsgFilterMax);

#014 if (-1 == (int) Res)

#015 {

#016 return Res;

#017 }

#018 Conversion.LParamSize = Info.LParamSize;

#019 Conversion.KMMsg = Info.Msg;

#020

把内核的消息方式转换用户的消息方式。

#021 if (! MsgiKMToUMMessage(&Conversion.KMMsg,&Conversion.UnicodeMsg))

#022 {

#023 return (BOOL) -1;

#024 }

#025 if (!lpMsg)

#026 {

#027 SetLastError( ERROR_NOACCESS );

#028 return FALSE;

#029 }

添加消息到转换队列。

#030 *lpMsg = Conversion.UnicodeMsg;

#031 Conversion.Ansi = FALSE;

#032 Conversion.FinalMsg = lpMsg;

#033 MsgConversionAdd(&Conversion);

#034 if (Res && lpMsg->message != WM_PAINT && lpMsg->message != WM_QUIT)

#035 {

在线程相关结构里保存最后接收的消息。

#036 ThreadData->LastMessage = Info.Msg;

#037 }

#038

#039 return Res;

#040}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读