reactos操作系统实现(178)

SendMessageW函数主要用来向窗口发送消息。下面就是它的实现代码:

#001  LRESULT WINAPI

#002  SendMessageW(HWND Wnd,

#003            UINT Msg,

#004            WPARAM wParam,

#005            LPARAM lParam)

#006  {

#007    MSG UMMsg, KMMsg;

#008    NTUSERSENDMESSAGEINFO Info;

#009    LRESULT Result;

#010 

 

如果不是广播消息,并且在合适范围的消息,就可以直接发送过去。

#011    if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST))

#012    {

#013        PWINDOW Window;

 

获取当前线程的结构。

#014        PW32THREADINFO ti = GetW32ThreadInfo();

#015 

 

检查窗口句柄是否有效,并获取窗口指针。

#016        Window = ValidateHwnd(Wnd);

#017        if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(ti))

#018        {

#019            /* NOTE: We can directly send messages to the window procedure

#020                     if *all* the following conditions are met:

#021 

#022                     * Window belongs to calling thread

#023                     * The calling thread is not being hooked

#024             */

#025 

 

直接发送给窗口处理函数。

#026            return IntCallMessageProc(Window, Wnd, Msg, wParam, lParam, FALSE);

#027        }

#028    }

#029 

 

填写消息结构。

#030    UMMsg.hwnd = Wnd;

#031    UMMsg.message = Msg;

#032    UMMsg.wParam = wParam;

#033    UMMsg.lParam = lParam;

 

执行进程间的通讯消息,主要是WM_DDE_ACKWM_DDE_EXECUTEWM_COPYDATA

#034    if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, FALSE))

#035      {

#036        return FALSE;

#037      }

#038    Info.Ansi = FALSE;

 

调用内核函数NtUserSendMessage来发送消息给窗口。

#039    Result = NtUserSendMessage(KMMsg.hwnd, KMMsg.message,

#040                               KMMsg.wParam, KMMsg.lParam, &Info);

#041    if (! Info.HandledByKernel)

#042      {

 

如果内核发送不成功,就需要直接调用窗口消息函数。

#043        MsgiUMToKMCleanup(&UMMsg, &KMMsg);

#044        /* We need to send the message ourselves */

#045        Result = IntCallWindowProcW(Info.Ansi, Info.Proc, UMMsg.hwnd, UMMsg.message,

#046                                    UMMsg.wParam, UMMsg.lParam);

#047      }

#048    else if (! MsgiUMToKMReply(&UMMsg, &KMMsg, &Result))

#049      {

#050        return FALSE;

#051      }

#052 

#053    return Result;

#054  }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

caimouse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值