《Windows程序设计》读书笔记------------->>键盘消息<<
2007-07-31 16:40
513 查看
和前面学到的一样,键盘也是通过消息来和程序进行交流的。WINDOWS会给处于焦点的程序发送键盘消息,根据按键的不同,发送的消息可能会有8种之多。不过对于像WM_SYSKEYDOWN之类的消息,交给系统自己去出去吧。然后WM_KEYUP又很少用到,所以,就可以专心处理 WM_KEYDOWN就好了。
当程序接受到一个 键盘消息(可以是上面提到的任何一种)的时候,在wParam(由于默认在低字组,不需要用LOWORD取出)参数里面包含了所按键的虚拟码,具体虚拟码在MSDN的Virtual-Key Codes专题里面列出(Virtual-Key Codes:ms-help://MS.MSDNQTR.2003FEB.2052/winui/winui/windowsuserinterface/userinput/VirtualKeyCodes.htm)。
我们可能比较常用的是:
其他的0-9,A-Z之类的,可以在字符消息中得到。
在消息中还有一个参数是lParam,里面包含了其他的一些信息,有重复计数,OEM扫描码,扩充键旗标,内容代码,键的先前状态,控制键状态。这些都可以通过一定的函数取出,不过书上也没说有什么用,暂时不管先。
下面就是具体使用的例子了。原来我们写过一个SYSTEM的多行文字的例子,这里就可以派上用场了。《Windows程序设计》的建议是使用SendMessage这个函数来实现这个功能,那么加入的代码是这样的:
case WM_KEYDOWN:
switch(LOWORD(wParam)) //也可以直接写成switch(wParam);
{
case VK_HOME:
SendMessage(hWnd,WM_VSCROLL,SB_TOP,0);
break;
case VK_END:
SendMessage(hWnd,WM_VSCROLL,SB_BOTTOM,0);
break;
case VK_NEXT:
SendMessage(hWnd,WM_VSCROLL,SB_PAGEDOWN,0);
break;
case VK_PRIOR:
SendMessage(hWnd,WM_VSCROLL,SB_PAGEUP,0);
break;
case VK_DOWN:
SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0);
break;
case VK_UP:
SendMessage(hWnd,WM_VSCROLL,SB_LINEUP,0);
break;
case VK_LEFT:
SendMessage(hWnd,WM_HSCROLL,SB_LINELEFT,0);
break;
case VK_RIGHT:
SendMessage(hWnd,WM_HSCROLL,SB_LINERIGHT,0);
break;
}
不过在MSDN的Using Scroll Bars专题中,MSDN给出了另外一个更好的代码:
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
wScrollNotify = SB_LINEUP;
break;
case VK_PRIOR:
wScrollNotify = SB_PAGEUP;
break;
case VK_NEXT:
wScrollNotify = SB_PAGEDOWN;
break;
case VK_DOWN:
wScrollNotify = SB_LINEDOWN;
break;
case VK_HOME:
wScrollNotify = SB_TOP;
break;
case VK_END:
wScrollNotify = SB_BOTTOM;
break;
}
if (wScrollNotify != -1)
SendMessage(hwnd, WM_VSCROLL, MAKELONG(wScrollNotify, 0), 0L);
break;
这样就不用写那么多行的SendMessage,所以建议使用这种方法写这个程序。
当程序接受到一个 键盘消息(可以是上面提到的任何一种)的时候,在wParam(由于默认在低字组,不需要用LOWORD取出)参数里面包含了所按键的虚拟码,具体虚拟码在MSDN的Virtual-Key Codes专题里面列出(Virtual-Key Codes:ms-help://MS.MSDNQTR.2003FEB.2052/winui/winui/windowsuserinterface/userinput/VirtualKeyCodes.htm)。
我们可能比较常用的是:
十进制 | 十六进制 | WINUSER.H标识符 | 必需? | IBM兼容键盘 |
33 | 21 | VK_PRIOR | ˇ | Page Up |
34 | 22 | VK_NEXT | ˇ | Page Down |
35 | 23 | VK_END | ˇ | End |
36 | 24 | VK_HOME | ˇ | Home |
37 | 25 | VK_LEFT | ˇ | 左箭头 |
38 | 26 | VK_UP | ˇ | 上箭头 |
39 | 27 | VK_RIGHT | ˇ | 右箭头 |
40 | 28 | VK_DOWN | ˇ | 下箭头 |
在消息中还有一个参数是lParam,里面包含了其他的一些信息,有重复计数,OEM扫描码,扩充键旗标,内容代码,键的先前状态,控制键状态。这些都可以通过一定的函数取出,不过书上也没说有什么用,暂时不管先。
下面就是具体使用的例子了。原来我们写过一个SYSTEM的多行文字的例子,这里就可以派上用场了。《Windows程序设计》的建议是使用SendMessage这个函数来实现这个功能,那么加入的代码是这样的:
case WM_KEYDOWN:
switch(LOWORD(wParam)) //也可以直接写成switch(wParam);
{
case VK_HOME:
SendMessage(hWnd,WM_VSCROLL,SB_TOP,0);
break;
case VK_END:
SendMessage(hWnd,WM_VSCROLL,SB_BOTTOM,0);
break;
case VK_NEXT:
SendMessage(hWnd,WM_VSCROLL,SB_PAGEDOWN,0);
break;
case VK_PRIOR:
SendMessage(hWnd,WM_VSCROLL,SB_PAGEUP,0);
break;
case VK_DOWN:
SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0);
break;
case VK_UP:
SendMessage(hWnd,WM_VSCROLL,SB_LINEUP,0);
break;
case VK_LEFT:
SendMessage(hWnd,WM_HSCROLL,SB_LINELEFT,0);
break;
case VK_RIGHT:
SendMessage(hWnd,WM_HSCROLL,SB_LINERIGHT,0);
break;
}
不过在MSDN的Using Scroll Bars专题中,MSDN给出了另外一个更好的代码:
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
wScrollNotify = SB_LINEUP;
break;
case VK_PRIOR:
wScrollNotify = SB_PAGEUP;
break;
case VK_NEXT:
wScrollNotify = SB_PAGEDOWN;
break;
case VK_DOWN:
wScrollNotify = SB_LINEDOWN;
break;
case VK_HOME:
wScrollNotify = SB_TOP;
break;
case VK_END:
wScrollNotify = SB_BOTTOM;
break;
}
if (wScrollNotify != -1)
SendMessage(hwnd, WM_VSCROLL, MAKELONG(wScrollNotify, 0), 0L);
break;
这样就不用写那么多行的SendMessage,所以建议使用这种方法写这个程序。
相关文章推荐
- 《Windows程序设计》读书笔记------------->>窗口和消息 -- 代码结构和消息机制<<
- 《Windows程序设计》读书笔记------------->>窗口和消息 ---- 具体设定<<
- 《Windows程序设计》读书笔记------------->>鼠标基础和显示区域鼠标消息<<
- 《Windows程序设计》读书笔记------------->>字符消息<<
- MFC中的消息处理----<深入解析MFC>读书笔记
- 《Windows程序设计》读书笔记------------->>第一个应用程序<<
- 《Windows程序设计》读书笔记------------->>输出文字----绘制和更新<<
- 《Windows程序设计》读书笔记------------->>文字输出---------TextOut单行输出<<
- 《Windows程序设计》读书笔记------------->>基本滚动条<<
- 《Windows程序设计》读书笔记------------->>设备内容之一<<
- 《Windows程序设计》读书笔记------------->>Virtual-Key Codes (虚拟键码)<<翻译自MSDN
- 《Windows程序设计》读书笔记------------->>GDI 映像方式<<
- 《Windows程序设计》读书笔记------------->>滚动条使用(翻译自MSDN)<<
- 《Windows程序设计》读书笔记------------->>字符集和字体<<
- <读书笔记>Windows内核安全 —— 第四章 键盘的过滤
- 《Windows程序设计》读书笔记------------->>设备内容句柄之二<<
- 《Windows程序设计》读书笔记------------->>矩形、区域和剪裁<<
- 《Windows程序设计》读书笔记------------->>开始画画!<<
- 《Windows程序设计》读书笔记------------->>关于Unicode<<
- 《Windows程序设计》读书笔记------------->>文字输出——多行文字<<