当Window是向程序发送消息时,它调用程序中的一个函数,这个函数用来描述Windows发送的消息,成为窗口函数消息处理函数。他是一个自定义的回调函数:

LRESULT CALLBACK WindowProc(HWND hwnd, UNIT uMsg, WPARAM wParam, LPARAM lParam);

  • CALLBACK 宏是_stdcall的意思,说明采用WIndows标准方式传递参数。 详见:https://blog.csdn.net/lionghua/article/details/38415655
  • uMsg:是一个消息ID号,它指定了所发的消息,当窗口函数接受到消息时,它使用消息ID号来决定如何处理这个消息;后面两个参数wParam和lParam的值也取决于uMsg。

例:关闭一个记事本程序,即向它的主窗口发送WM_CLOSE消息:

int main(int argc,char* argv[])
{
//查找标题为“无标题-记事本“的窗口
HWND hWnd = ::FindWindow(NULL,"无标题-记事本");
//也可以使用类名查找,如 FindWindow("Notepad",NULL); if(hWnd != NULL)
::SendMessage(hWnd,WM_CLOSE,,);
return ;
}
  • FindWindow函数:查找窗口类名称和窗口标题与指定字符串相匹配的窗口。
  • SendMessage函数: 向窗口发送消息,直到目标窗口处理完这个消息才返回。参数与WindowProc函数相同。

以下是Windows程序的基本框架,win32程序都是在这个框架的基础上扩充而来:

 #include <windows.h>

 LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
//用描述主窗口的参数来填充WNDCLASSEX结构
wndclass.cbSize=sizeof(wndclass); //结构大小
wndclass.style=CS_HREDRAW | CS_VREDRAW; //指定如果大小改变就重画
wndclass.lpfnWndProc=MainWndProc; //窗口指针函数
wndclass.cbClsExtra=; //没有额外的类内存
wndclass.cbWndExtra=; //没有额外窗口内存
wndclass.hInstance = hInstance; //实例句柄
wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION); //使用预定义图标
wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW); //使用预定义光标
wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); //使用白色背景画刷
wndclass.lpszMenuName=NULL; //不指定菜单
wndclass.lpszClassName=szClassName; //窗口类名称
wndclass.hIconSm=NULL; //没有类的小图标 //注册这个窗口类
::RegisterClassEx(&wndclass);
//创建主窗口
HWND hWnd=::CreateWindowEx(
, //dwExStyle,扩展样式
szClassName, //lpClassName,类名
"My First Window!", //lpWindowName,窗口标题
WS_OVERLAPPEDWINDOW, //swStyle,窗口风格
CW_USEDEFAULT, //X,初始x坐标
CW_USEDEFAULT, //Y,初始y坐标
CW_USEDEFAULT, //nWidth,宽度
CW_USEDEFAULT, //nHeight,高度
NULL, //hWndParent,父窗口句柄
NULL, //hMenu,菜单句柄
hInstance, //hInstance,程序实例句柄
NULL); //lpParam,用户数据 if(hWnd == NULL)
{
::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
return -;
}
//显示窗口,刷新窗口客户区
::ShowWindow(hWnd,nCmdShow);
::UpdateWindow(hWnd);
//从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg,NULL,,))
{
//转化键盘消息
::TranslateMessage(&msg);
//将消息发送到相应的窗口函数
::DispatchMessage(&msg);
}
return msg.wParam;
} LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
char szText[]="Hello World!";
switch(message)
{
case WM_PAINT: //窗口客户区重绘
{
HDC hdc;
PAINTSTRUCT ps;
//使无效的客户区变得有效,并取得设备环境句柄
hdc=::BeginPaint(hWnd,&ps);
//显示文字
::TextOut(hdc,,,szText,strlen(szText));
::EndPaint(hWnd,&ps);
return ;
}
case WM_DESTROY: //销毁窗口
::PostQuitMessage();
return ;
}
//将不处理的消息交给系统默认处理
return ::DefWindowProc(hWnd,message,wParam,lParam);
}

简单Win窗口

Windos消息驱动的更多相关文章

  1. Intellij IDEA 创建消息驱动Bean - 接收JMS消息

    除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...

  2. JMS和消息驱动Bean(MDB)

    一.说明 本示例使用的ActiveMQ作为消息中间件,服务器为Glassfish,使用JMS发送消息,在MDB接收到消息之后做打印输出. 二.ActiveMQ安装配置 1.安装console war包 ...

  3. EJB_消息驱动发展bean

    消息驱动发展bean Java信息服务(Java MessageService) Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API ...

  4. Akka(1):Actor - 靠消息驱动的运算器

    Akka是由各种角色和功能的Actor组成的,工作的主要原理是把一项大的计算任务分割成小环节,再按各环节的要求构建相应功能的Actor,然后把各环节的运算托付给相应的Actor去独立完成.Akka是个 ...

  5. EJB_开发消息驱动bean

    开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...

  6. SpringCloud实战9-Stream消息驱动

    官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...

  7. 「Android」消息驱动Looper和Handler类分析

    Android系统中的消息驱动工作原理: 1.有一个消息队列,可以往这个消息队列中投递消息; 2.有一个消息循环,不断的从消息队列中取得消息,然后处理. 工作流程: 1.事件源将待处理的消息加入到消息 ...

  8. 使用 Spring Cloud Stream 构建消息驱动微服务

    相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...

  9. 基于Kafka消息驱动最终一致事务(二)

    实现用例分析 上篇基于Kafka消息驱动最终一致事务(一)介绍BASE的理论,接着我们引入一个实例看如何实现BASE,我们会用图7显示的算法实现BASE.

随机推荐

  1. 阿里云HttpClient跨天之后解析不了域名

    也许这是一个少见的情况,我使用HttpClient写了一个调用第三方服务的请求,在本机测试和腾讯云上测试都没有问题,但是放到阿里云之后,刚启动的时候是没有问题的,但是每次过零点之后,就会报异常: ja ...

  2. python大作业

    爬取西刺代理 生成请求头 #encoding = utf-8; __all__ = ("Header"); import random; class Header(object): ...

  3. 关于 IIS 的 Management Service Delegation 配置 备份

    在MSDN没找到关于使用APPCMD备份IIS的"Management Service Delegation"模块配置命令. 到IIS的配置文件存放目录下,几番搜索,查到%wind ...

  4. [dart学习]第三篇:dart变量介绍 (二)

    本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...

  5. windows下使用electron+sqlite3

    1.前置条件 1.1:安装 python2.7.python 若是有问题,如果之前安装过多个版本,则必须 npm config set python "/path/python.exe&qu ...

  6. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  7. range 小数据池介绍

    1.range 2.小数据池 1. range 范围 [起始位置:终止位置:步长]range(起始位置,终止位置,步长) #顾头不顾尾 3.小数据池 小数据池,也称为小整数缓存机制,或者称为驻留机制等 ...

  8. mongodb常用查询语句

    1.查询所有记录db.userInfo.find();相当于:select* from userInfo; 2.查询去掉后的当前聚集集合中的某列的重复数据db.userInfo.distinct(&q ...

  9. threadpool源码学习

    threadpool源码学习 __all__ = [ 'makeRequests', 'NoResultsPending', 'NoWorkersAvailable', 'ThreadPool', ' ...

  10. <工厂方法>比<简单工厂>多了啥

    前言:多注重设计.仅当复习讨论! 简单工厂模式 UML图   假如有一位爱心人士,想给饥饿的流浪动物喂食.此时爱心人士身带了狗粮,但是他到处找啊找,最终只找到了猫大人,是不是有点惨兮兮.但是如果有简单 ...