消息循環中的TranslateMessage函數和DispatchMessage函數,特別注意WM_TIMER消息


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轉換的消息 發送到窗口的消息處理函數,此函數在窗口注冊時已經指定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM