reactos操作系统实现(168)

当应用程序更新窗口后,就需要不断地接收系统发过来的消息,然后处理消息,最后发送消息出去,这样就构成了应用程序的消息循环处理。不断地获取系统消息的函数是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, 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  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值