TranslateMessage函數
函數功能描述:將虛擬鍵消息轉換為字符消息。字符消息被送到調用線程的消息隊列中,在下一次線程調用函數GetMessage或PeekMessage時被讀出。
.
函數原型:
BOOL TranslateMessage( CONST MSG *lpMsg );
BOOL TranslateMessage( CONST MSG *lpMsg );
.
參數:
lpMsg
指向一個含有用GetMessage或PeekMessage函數從調用線程的消息隊列中取得消息信息的MSG結構的指針。
lpMsg
指向一個含有用GetMessage或PeekMessage函數從調用線程的消息隊列中取得消息信息的MSG結構的指針。
.
返回值:
如果消息被轉換(即,字符消息被送到線程的消息隊列中),返回非零值。
如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考慮轉換。
如果消息沒有轉換(即,字符消息沒被送到線程的消息隊列中),返回值是零。
如果消息被轉換(即,字符消息被送到線程的消息隊列中),返回非零值。
如果消息是 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函數接收到的消息。
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轉換的消息
發送到窗口的消息處理函數,此函數在窗口注冊時已經指定。