Window的消息循环机制

一.废话少说,直接上图

0x0用户运行一个应用程序,通过对鼠标的点击或键盘按键,产生一些特定事件
0x1 由于Windows一直监控I/O设备,该事件首先会被翻译成消息,由系统捕获,存放于系统消息队列
0x2 经分析,Windows知道该消息应由哪个应用程序处理,则拷贝到相应的应用程序消息队列
0x3 由于消息循环不断检索自身的消息队列,当发现应用程序消息队列里有消息,就用GetMessage()取出消息,封装成Msg()结构。如果该消息是由键盘按键产生的,用TranslateMessage()翻译为WM_CHAR消息,否则,用DisPatchMessage()将取出的消息分发到相应的应用程序窗口,交由窗口处理程序处理;
0x4 Windows为每个窗体预留了过程窗口函数,该函数是一个回调函数,由系统调用,应用程序不能调用;但是我们可以通过重载该函数处理我们”感兴趣”的消息。对于不感兴趣的消息,则由系统默认的窗口过程处理程序做出处理。

在这里插入图片描述

在这里插入图片描述

二.基本骨架
while (GetMessageW(&msg, NULL, 0, 0) != 0) {
 	 TranslateMessage(&msg);
     DispatchMessageW(&msg);
     if (msg.message == WM_KEYDOWN) {
        if (msg.wParam == VK_ESCAPE/*虚拟键*/) {
            break;
        }
    }
};
二.Window窗口特性

所有的Window窗口都是从一个线程里面派生出来的,当需要使用到这个界面上的控件数据的时候,必须确保是在本线程去获取和读写。否则会导致程序奔溃(做了一层校验),这是设计者为了否则出现以下情况:
本线程在读写界面控件变量,另一个线程也在读写界面控件变量!

如果遇到了上面的情况,我们应该怎么去解决呢?
答:自定义消息,然后把获取界面控件变量的代码放到本线程去执行

  • 步骤一:定义消息号

    #define WM_SEND_PACKET (WM_USER+1)
    
  • 步骤二:定义消息映射函数

    afx_msg LRESULT OnSendPacket(WPARAM wParam, LPARAM lParam);
    
  • 步骤三:添加到消息映射表

    ON_MESSAGE(WM_SEND_PACKET, &CRemoteClientDlg::OnSendPacket)
    
  • 步骤四:替换导致奔溃的代码

    int ret = SendMessage(WM_SEND_PACKET, 4 << 1 | 0, (LPARAM)(LPCSTR)strFile);
    

总结:消息机制是Window最大的特点之一,所以我们在Window下编程最好使用它这个特点来设计和编程;切记不要在Window下使用Linux特有的机制,在Linux使用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值