SendMessage的大致流程

SendMessage在处理消息时,会根据目标窗口是否为广播进行不同操作。广播消息时,利用EnumWindows遍历所有窗体。若目标窗口与发送线程相同,直接调用回调;否则,通过send_inter_thread_message进行线程间消息传递,消息会被放入目标线程的消息队列等待处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、构造send_message_info结构体,然后调用send_message函数。 SendMessageA和SendMessageW的区别有两处:info.type一个是MSG_ASCII,一个是MSG_UNICODE;send_message函数的第三个参数一个为TRUE一个为FALSE。
LRESULT WINAPI SendMessageA( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
    DWORD_PTR res = 0;
    struct send_message_info info;

    info.type    = MSG_ASCII;
    info.hwnd    = hwnd;
    info.msg     = msg;
    info.wparam  = wparam;
    info.lparam  = lparam;
    info.flags   = SMTO_NORMAL;
    info.timeout = 0;
    info.wm_char  = WMCHAR_MAP_SENDMESSAGE;
    send_message( &info, &res, FALSE );
    return res;
}

2、send_message

首先判断是不是广播消息,从is_broadcast函数代码来看,目的窗口句柄为HWND_BROADCAST或HWND_TOPMOST的是广播消息。对于广播消息,它使用EnumWindows通过回调函数broadcast_message_callback,将消息发给每一个窗体。

GetWindowThreadProcessId函数,通过目的窗口句柄获取窗口所在进程和线程id

如果目的窗口线程和当前发送线程相同,它直

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值