zoukankan      html  css  js  c++  java
  • Windos消息驱动

    当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,0,0);
        return 0;
    }
    • FindWindow函数:查找窗口类名称和窗口标题与指定字符串相匹配的窗口。
    • SendMessage函数: 向窗口发送消息,直到目标窗口处理完这个消息才返回。参数与WindowProc函数相同。

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

     1 #include <windows.h>
     2 
     3 LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
     4 int APIENTRY WinMain(HINSTANCE hInstance,
     5                             HINSTANCE hPrevInstance,
     6                             LPSTR lpCmdLine,
     7                             int nCmdShow)
     8 {
     9     char szClassName[] = "MainWClass";
    10     WNDCLASSEX wndclass;
    11     //用描述主窗口的参数来填充WNDCLASSEX结构
    12     wndclass.cbSize=sizeof(wndclass);    //结构大小
    13     wndclass.style=CS_HREDRAW | CS_VREDRAW;    //指定如果大小改变就重画
    14     wndclass.lpfnWndProc=MainWndProc;    //窗口指针函数
    15     wndclass.cbClsExtra=0;    //没有额外的类内存
    16     wndclass.cbWndExtra=0;    //没有额外窗口内存
    17     wndclass.hInstance = hInstance;    //实例句柄
    18     wndclass.hIcon=::LoadIcon(NULL, IDI_APPLICATION);    //使用预定义图标
    19     wndclass.hCursor=::LoadCursor(NULL, IDC_ARROW);     //使用预定义光标
    20     wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);    //使用白色背景画刷
    21     wndclass.lpszMenuName=NULL;    //不指定菜单
    22     wndclass.lpszClassName=szClassName;    //窗口类名称
    23     wndclass.hIconSm=NULL;    //没有类的小图标
    24     
    25     //注册这个窗口类
    26     ::RegisterClassEx(&wndclass);
    27     //创建主窗口
    28     HWND hWnd=::CreateWindowEx(
    29             0,                                      //dwExStyle,扩展样式
    30             szClassName,                     //lpClassName,类名
    31             "My First Window!",              //lpWindowName,窗口标题
    32             WS_OVERLAPPEDWINDOW,    //swStyle,窗口风格
    33             CW_USEDEFAULT,                //X,初始x坐标
    34             CW_USEDEFAULT,                //Y,初始y坐标
    35             CW_USEDEFAULT,                //nWidth,宽度
    36             CW_USEDEFAULT,                //nHeight,高度
    37             NULL,                                //hWndParent,父窗口句柄
    38             NULL,                                //hMenu,菜单句柄
    39             hInstance,                         //hInstance,程序实例句柄
    40             NULL);                               //lpParam,用户数据
    41     
    42     if(hWnd == NULL)
    43     {
    44         ::MessageBox(NULL,"创建窗口出错!","error",MB_OK);
    45         return -1;
    46     }    
    47     //显示窗口,刷新窗口客户区
    48     ::ShowWindow(hWnd,nCmdShow);
    49     ::UpdateWindow(hWnd);
    50     //从消息队列中取出消息,交给窗口函数处理,直到GetMessage返回FALSE,结束消息循环
    51     MSG msg;
    52     while(::GetMessage(&msg,NULL,0,0))
    53     {
    54         //转化键盘消息
    55         ::TranslateMessage(&msg);
    56         //将消息发送到相应的窗口函数
    57         ::DispatchMessage(&msg);
    58     }
    59     return msg.wParam;
    60 }
    61 
    62 LRESULT CALLBACK MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    63 {
    64     char szText[]="Hello World!";
    65     switch(message)
    66     {
    67     case WM_PAINT:    //窗口客户区重绘
    68             {
    69                 HDC hdc;
    70                 PAINTSTRUCT ps;
    71                 //使无效的客户区变得有效,并取得设备环境句柄
    72                 hdc=::BeginPaint(hWnd,&ps);
    73                 //显示文字
    74                 ::TextOut(hdc,10,10,szText,strlen(szText));
    75                 ::EndPaint(hWnd,&ps);
    76                 return 0;    
    77             }
    78     case WM_DESTROY:    //销毁窗口
    79                 ::PostQuitMessage(0);
    80                 return 0;
    81     }
    82     //将不处理的消息交给系统默认处理
    83     return ::DefWindowProc(hWnd,message,wParam,lParam);
    84 }
    简单Win窗口
  • 相关阅读:
    VS.NET 生成后事件
    SysVinit
    技巧:Linux I/O重定向的一些小技巧
    Ofono/Phonesim 安装和启动
    Memory Hierarchy
    Linux 技巧:让进程在后台可靠运行的几种方法 用 cron 和 at 调度作业 使用 screen 管理你的远程会话
    M. Tim Jones
    How do I install Oracle Java JDK 7?
    详谈 UNIX 环境进程异常退出
    Linux 内核剖析
  • 原文地址:https://www.cnblogs.com/ShadowCharle/p/10696810.html
Copyright © 2011-2022 走看看