TranslateMessage
是用来把虚拟键消息转换为字符消息。由于
Windows
对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。 TranslateMessage
函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中,当下一次调用
GetMessage
函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生
WM_KEYDOWN
和
WM_KEYUP
消息。这两个消息的附加参数(
wParam
和
lParam
)包含的是虚拟键代码和扫描码等信息,而我们在程序中往往需要得到某个字符的
ASCII
码,
TranslateMessage
这个函数就可以将
WM_KEYDOWN
和
WM_ 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 _tWinMainHINSTANCE hInstance, #007 HINSTANCE hPrevInstance, #008 LPTSTR lpCmdLine, #009 int nCmdShow) #010 {
#011 UNREFERENCED_PARAMETERhPrevInstance); #012 UNREFERENCED_PARAMETERlpCmdLine); #013 #014 // #015 MSG msg; #016 HACCEL hAccelTable; #017 #018 //
加载全局字符串。 #019 LoadStringhInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); #020 LoadStringhInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING); #021 MyRegisterClasshInstance); #022 #023 //
应用程序初始化
: #024 if !InitInstance hInstance, nCmdShow)) #025 {
#026 return FALSE; #027 } #028 #029 hAccelTable = LoadAcceleratorshInstance, MAKEINTRESOURCEIDC_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 !TranslateAcceleratormsg.hwnd, hAccelTable, &msg)) #041 {
#042 TranslateMessage&msg); #043 DispatchMessage&msg); #044 } #045 } #046 #047 return int) msg.wParam; #048 } #049
第
42
行是调用函数
TranslateMessage
作消息转换工作。