C++ -- TranslateMessage函式

edwardking888發表於2014-07-29
TranslateMessage是用來把虛擬鍵訊息轉換為字元訊息。由於Windows對所有鍵盤編碼都是採用虛擬鍵的定義,這樣當按鍵按下時,並不得字元訊息,需要鍵盤對映轉換為字元的訊息。
TranslateMessage函式用於將虛擬鍵訊息轉換為字元訊息。字元訊息被投遞到呼叫執行緒的訊息佇列中,當下一次呼叫GetMessage函式時被取出。當我們敲擊鍵盤上的某個字元鍵時,系統將產生WM_KEYDOWNWM_KEYUP訊息。這兩個訊息的附加引數(wParamlParam)包含的是虛擬鍵程式碼和掃描碼等資訊,而我們在程式中往往需要得到某個字元的ASCII碼,TranslateMessage這個函式就可以將WM_KEYDOWNWM_ KEYUP訊息的組合轉換為一條WM_CHAR訊息(該訊息的wParam附加引數包含了字元的ASCII碼),並將轉換後的新訊息投遞到呼叫執行緒的訊息佇列中。注意,TranslateMessage函式並不會修改原有的訊息,它只是產生新的訊息並投遞到訊息佇列中。
也就是說TranslateMessage會發現訊息裡是否有字元鍵的訊息,如果有字元鍵的訊息,就會產生WM_CHAR訊息,如果沒有就會產生什麼訊息。
 
函式TranslateMessage宣告如下:
WINUSERAPI
BOOL
WINAPI
TranslateMessage(
    __in CONST MSG *lpMsg);
lpMsg是檢查需要轉換的訊息。
 
呼叫這個函式的例子如下:
#001 //主程式入口
#002 //
#003 // 蔡軍生 2007/07/19
#004 // QQ: 9073204
#005 //
#006 int APIENTRY _tWinMain(HINSTANCE hInstance,
#007                       HINSTANCE hPrevInstance,
#008                       LPTSTR    lpCmdLine,
#009                       int       nCmdShow)
#010 {
#011  UNREFERENCED_PARAMETER(hPrevInstance);
#012  UNREFERENCED_PARAMETER(lpCmdLine);
#013 
#014   //
#015  MSG msg;
#016  HACCEL hAccelTable;
#017 
#018  // 載入全域性字串。
#019  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
#020  LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING);
#021  MyRegisterClass(hInstance);
#022 
#023  // 應用程式初始化:
#024  if (!InitInstance (hInstance, nCmdShow))
#025  {
#026         return FALSE;
#027  }
#028 
#029  hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));
#030 
#031  // 訊息迴圈:
#032  BOOL bRet;
#033  while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
#034  {
#035          if (bRet == -1)
#036         {
#037               //處理出錯。
#038 
#039         }
#040         else if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
#041         {
#042               TranslateMessage(&msg);
#043               DispatchMessage(&msg);
#044         }
#045  }
#046 
#047  return (int) msg.wParam;
#048 }
#049 
 
42行是呼叫函式TranslateMessage作訊息轉換工作。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-1241500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章