TranslateMessage函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码)
而我发现组合后会使WM_KEYUP消息消失。。有例子(部分代码):在键盘上按下A键(使用小写模式)。。 case WM_KEYDOWN:
if(0x41==wParam)
MessageBox(hwnd,"A","1",1);
return 0;
case WM_KEYUP:
if(0x41==wParam)
MessageBox(hwnd,"A","2",1);
return 0;
case WM_CHAR:
if(0x61==wParam)
MessageBox(hwnd,"a","3",1);
return 0; 先收到WM_CHAR 再收到WM_KEYDOWN而为什么看不到WM_KEYUP弹出的对话框???而且顺序为什么是WM_CHAR 后是WM_KEYDOWN??可以删除WM_CHAR消息和WM_KEYDOWN消息后,发现WM_KEYUP 又回来了。。请问这是为什么啊??
而我发现组合后会使WM_KEYUP消息消失。。有例子(部分代码):在键盘上按下A键(使用小写模式)。。 case WM_KEYDOWN:
if(0x41==wParam)
MessageBox(hwnd,"A","1",1);
return 0;
case WM_KEYUP:
if(0x41==wParam)
MessageBox(hwnd,"A","2",1);
return 0;
case WM_CHAR:
if(0x61==wParam)
MessageBox(hwnd,"a","3",1);
return 0; 先收到WM_CHAR 再收到WM_KEYDOWN而为什么看不到WM_KEYUP弹出的对话框???而且顺序为什么是WM_CHAR 后是WM_KEYDOWN??可以删除WM_CHAR消息和WM_KEYDOWN消息后,发现WM_KEYUP 又回来了。。请问这是为什么啊??
至于为什么先 WM_CHAR消息 是因为TranslateMessage 会先发送 WM_CHAR消息
hdc=GetDC(hwnd);
if(0x41==wParam)
TextOut(hdc,200,200,szBuffer,wsprintf(szBuffer,"WM_KEYDOWN"));
ReleaseDC(hwnd,hdc);
_sleep(1000);
return 0;
case WM_KEYUP:
hdc=GetDC(hwnd);
if(0x41==wParam)
TextOut(hdc,0,0,szBuffer,wsprintf(szBuffer,"WM_KEYUP"));
ReleaseDC(hwnd,hdc);
_sleep(1000);
return 0;
case WM_CHAR:
hdc=GetDC(hwnd);
if(0x61==wParam)
TextOut(hdc,70,70,szBuffer,wsprintf(szBuffer,"WM_CHAR"));
ReleaseDC(hwnd,hdc);
_sleep(1000);
return 0;
测试了一下 WM_CHAR 确实不是 TranslateMessage 发出的,DispatchMessage会先后将WM_CHAR,WM_KEYDOWN消息派发给窗口过程,具体原因看3楼,我没看懂,以后用得着再来纠结吧。。