zoukankan      html  css  js  c++  java
  • 消息循环中的TranslateMessage函数和DispatchMessage函数,特别注意WM_TIMER消息

    原文:http://www.cnblogs.com/xingrun/p/3583357.html

    TranslateMessage函数

    函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。

    .函数原型:
        BOOL TranslateMessage(  CONST MSG *lpMsg );
    .参数:
        lpMsg 
            指向一个含有用GetMessage或PeekMessage函数从调用线程的消息队列中取得消息信息的MSG结构的指针。
    .返回值:
        如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。
        如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考虑转换。
        如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零。
    .备注:
        TranslateMessage函数不修改由参数lpMsg指向的消息。
        消息WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR 消息。
        TtanslateMessage仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。
        如果应用程序为其它用途而处理虚拟键消息,不应调用TranslateMessage函数。例如,如果TranslateAccelerator函数返回一个非零值,则应用程序将不调用TranslateMessage函数。
        Windows CE:Windows CE不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage函数产生的WM_CHAR消息中的lKeyData参数(lParam)16-24的取值。
        TranslateMessage函数只能用于转换由GetMessage或PeekMessage函数接收到的消息。 

     

    DispatchMessage函数

    函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。

      函数原型:LONG DispatchMessage(CONST MSG*lpmsg);

      参数:

      lpmsg:指向含有消息的MSG结构的指针。

      返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

      备注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IParam指向的函数,而不是调用窗口程序。

      速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

    总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.

    联系:

    在Windows的内部,GetMessage和PeekMessage执行着相同的代码,Peekmessage和Getmessage都是向系统的消息队列中取得消息,并将其放置在指定的结构。
     
    区别:
    PeekMessage:有消息时返回TRUE,没有消息返回FALSE   
    GetMessage:有消息时且消息不为WM_QUIT时返回TRUE,如果有消息且为WM_QUIT则返回FALSE,没有消息时不返回。
    GetMessage:取得消息后,删除除WM_PAINT消息以外的消息。
    PeekMessage:取得消息后,根据wRemoveMsg参数判断是否删除消息。PM_REMOVE则删除,PM_NOREMOVE不删除。
    The PeekMessage function normally does not remove WM_PAINT messages from the queue. WM_PAINT messages remain in the queue until they are processed. However, if a WM_PAINT message has a null update region, PeekMessage does remove it from the queue.
    不能用PeekMessage从消息队列中删除WM_PAINT消息,从队列中删除WM_PAINT消息可以令窗口显示区域的失效区域变得有效(刷新窗口),如果队列中包含WM_PAINT消息程序就会一直while循环了。
     
    用法:
    原型:BOOL GetMessage(
      LPMSG lpMsg,         // address of structure with message
      HWND hWnd,           // handle of window
      UINT wMsgFilterMin,  // first message
      UINT wMsgFilterMax   // last message
    );
    while (GetMessage(&msg, NULL, 0, 0))       
    {       
        TranslateMessage (&msg);       
        DispatchMessage (&msg);       
    }      
    return msg.wParam;
     
    原型:
    BOOL PeekMessage(
      LPMSG lpMsg,         // pointer to structure for message
      HWND hWnd,           // handle to window
      UINT wMsgFilterMin,  // first message
      UINT wMsgFilterMax,  // last message
      UINT wRemoveMsg      // removal flags
    );
    while (TRUE)
    {        
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))        
        {        
                if (msg.message == WM_QUIT)        
                       break;        
                TranslateMessage (&msg);        
                DispatchMessage (&msg);        
        }        
        else        
        {        
                // 处理空闲任务        
        }       
    }       
    return msg.wParam;
     
    TranslateMessage(转换消息):
    用来把虚拟键消息转换为字符消息。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
    TranslateMessage函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数(wParam和lParam)包含的是虚拟键代码和扫描码等信息,而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中。注意,TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
    也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就会产生什么消息。
     
    DispatchMessage(分派消息):
    把 TranslateMessage转换的消息发送到窗口的消息处理函数,此函数在窗口注册时已经指定。
  • 相关阅读:
    MS SQLSERVER 第三天
    MS SQLSERVER 第二天
    今天开始我的 MSSQLSERVER 之旅
    从今天开始就正式我的博客之旅
    mac 本地搭建mybatisGenerator代码生成环境
    idea中git远程版本回退
    Junit调试解决本地多线程异步调用
    Lambda表达式总结
    JDK8函数式编程之Stream API
    MySql分页查询慢的解决方案
  • 原文地址:https://www.cnblogs.com/lizhigang/p/7151564.html
Copyright © 2011-2022 走看看