《Windows程序设计》读书笔记------------->>键盘消息<<

来源:互联网 发布:在linux下启动tomcat 编辑:程序博客网 时间:2024/05/17 03:00

和前面学到的一样,键盘也是通过消息来和程序进行交流的。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)。

我们可能比较常用的是:

十进制

十六进制

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

ˇ

下箭头

其他的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,所以建议使用这种方法写这个程序。

原创粉丝点击