首页 > 编程语言 >Win32编程之消息机制(二)

Win32编程之消息机制(二)

时间:2023-09-06 23:11:06浏览次数:45  
标签:窗口 hWnd 编程 ID Win32 nMsg 消息 机制 处理函数

一、Windows的消息概念

1.消息组成:

  • 窗口句柄
  • 消息ID
  • 消息的两个参数(两个附带信息)
  • 消息产生的时间
  • 消息产生时鼠标位置
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
} MSG  

2.消息的作用

当系统通知窗口工作时,就采用消息的方式派发给窗口

二、消息循环

//消息循环
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
	TranslateMessage(&nMsg);//将虚拟消息转换为字符消息
	DispatchMessage(&nMsg);//将消息分发给窗口处理函数
}

1.GetMessage():获取本进程的消息

WINUSERAPI BOOL WINAPI
GetMessageA(
    _Out_ LPMSG lpMsg,//存放获取到的消息BUFF
    _In_opt_ HWND hWnd,//窗口句柄
    _In_ UINT wMsgFilterMin,//获取消息的最小ID
    _In_ UINT wMsgFilterMax//获取消息的最大ID
);  

lpMsg:当获取到消息后,将消息的参数存放到MSG结构中

hWnd:获取到hWnd所指定窗口的消息

wMsgFilterMin和wMsgFilterMax:只能获取到由它们指定的消息范围内的消息,如果都为0,表示没有范围

2.TranslateMessage():翻译消息,将按键消息翻译成字符消息

BOOL WINAPI
TranslateMessage(
    _In_ CONST MSG *lpMsg //要翻译的消息地址
);

检查消息是否有按键消息,如果不是按键消息,不做任何处理,继续执行

3.DispatchMessage()函数执行流程:

DispatchMessage(&nMsg) {
    nMsg.hwnd --> 通过窗口句柄找到保存窗口数据的内存 -->然后找到窗口消息处理函数
    WndProc(nMsg.hWnd, nMsg.msgID, nMsg.wParam, nMsg.lParam) {
       //执行消息处理函数  
    }    
}

 每个窗口都必须具有窗口处理函数:

LRESULT CALLBACK 
WindProc(
  HWND hWnd, //窗口句柄
  UINT msgID, //消息ID
  WPARAM wParam, //消息参数
  LPARAM lParam //消息参数
);

当系统通知窗口时,会调用窗口处理函数,同时将消息ID和消息参数传递给窗口处理函数,在窗口处理函数中,不处理的消息,使用缺省窗口处理函数,例如:DefWindowProc

 

 

 

标签:窗口,hWnd,编程,ID,Win32,nMsg,消息,机制,处理函数
From: https://www.cnblogs.com/TechNomad/p/17683666.html

相关文章

  • 2023年09月编程语言流行度排名
    点击查看最新编程语言流行度排名(每月更新)2023年09月编程语言流行度排名编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的一门语言教程被搜索的次数越多,大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自谷歌Trends如果您相信集体智慧,那么流行编程......
  • Redis持久化机制
    1.怎么保证Redis挂掉之后再重启数据可以进行恢复?(持久化)很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。Redis不同于Memcached......
  • 《Java编程思想第四版》学习笔记25
    若调用了break和continue语句,finally语句也会得以执行。请注意,与作上标签的break和continue一道,finally排除了Java对goto跳转语句的需求。                                       ......
  • 《Java编程思想第四版》学习笔记24
    //:FinallyWorks.java//ThefinallyclauseisalwaysexecutedpublicclassFinallyWorks{staticintcount=0;publicstaticvoidmain(String[]args){while(true){try{//post-incrementiszerofirsttime:......
  • C#+WPF上位机开发课程(模块化与反应式编程)
    点击下载:C#+WPF上位机开发课程(模块化与反应式编程)提取码:ak72上位机是指可以直接发出操控命令的计算机,一般是PC,通常用于屏幕上显示各种信号变化(液压,水位,温度等),并将这些数据存储下来,供分析。 下位机是直接控制设备,获取设备状况的计算机,一般是PLC(ProgrammableLogicController)/单......
  • [个人笔记][C#]异步编程
    多线程的一点基础知识单核的性能逐渐逼近工业能力上限,开始通过多核来提高性能多线程逻辑很难写通过System.Diagnostics.Process访问进程被调用操作的执行和完成独立于调用它的控制流要从IO受限的阻塞线程切换到就绪线程,提高处理器利用率,防止处理器闲置上下文切换会把寄存器......
  • C#面向切面编程的框架
    C#类似Java中Spring的实现依赖注入和面向切面编程的框架有很多Unity:Unity是一个轻量级的依赖注入(DI)容器,具有简单易用的特点。它在配置方面较为灵活,适用于小型项目和快速搭建原型。Autofac:Autofac是一个功能丰富的依赖注入(DI)容器,支持更高级的依赖注入功能,如属性注入和构造函......
  • Spring Boot中自动装配机制的原理
    SpringBoot中自动装配机制的原理1.自动装配,简单来说就是自动把第三方组件的Bean装载到SpringIOC容器里面,不需要开发人员再去写Bean的装配配置,2.在SpringBoot应用里面,只需要在启动类加上@SpringBootApplication注解就可以实现自动装配。3.@SpringBootApplication是一个复合注......
  • Linux应用编程_多线程编程
    (1)线程的创建: pthread_ttid=pthread_self(); //获取当前线程的tid号 intret=pthread_create(&tid1,NULL,fun1,(void*)&a);//创建线程传入变量a的地址 ret=pthread_create(&tid2,NULL,fun2,(void*)(long)a);//创建线程传入变量a的值(2)线程的退出与回收: pth......
  • Linux应用编程_网络通信TCP/UDP
    (1)网络协议被分为5层 1)应用层:直接为用户的应用进程提供服务 HTTP协议,FTP协议,DNS,POP3,SNMP,Telnet 2)运输层(传输层):负责向两个主机中进程之间的通信提供服务 (基于TCP/UDP) (1)传输控制协议TCP(TransmissionControlProtocol): 1)数据传输的单位是报文段 2)面向......