系统键就是系统御用的按键,供系统优先完成一些功能的按键,和普通的按键有所不同。系统按键的按下消息处理是在WM_SYSKEYDOWN处理的。系统的消息处理,在消息名称前含有SYS字样。
在学习过程中,我总想搞清楚系统键到底有哪些。然而网上搜不到相关资料,MSDN中似乎说的是F10和Alt键。不过,感觉这个答案还是不是最准确的。
所以,就亲自用代码来验证一下即可。如果是系统键,则系统会优先处理。而系统要处理系统键,则在WM_SYSKEYDOWN消息中进行。而普通的按键,则在WM_KEYDOWN中进行。所以,我们来分别测试一下,将我们可能以为的按键来测试一番。
我们在文章《如何拦截和屏蔽F1到F12功能键(实现F10菜单功能键的拦截和屏蔽) 》已经得知,F10是系统键。如果屏蔽F也在文中分析了。
我们测试的其他的按键是否为系统键的方法也很简单,就是弹出一个消息框,显示对应的按键的名称。通过判断wParam参数中附带的虚拟键码即可。代码示例如下:
也就是说,Alt有双重身份,即使系统键,也是非系统键。只不过系统键的优先级更高。如果你想屏蔽Alt键,就要WM_SYSKEYDOWN中屏蔽。这个和F10的屏蔽是一样的原理。
那么最后的结论就是,系统键基本上只有两个,即Alt和F10。这两个按键的作用就是激活菜单的,为系统所用。Alt也可以用作普通的按键,可以自己和其他按键组合成快捷键。
下面是虚拟键码的定义列表:
在学习过程中,我总想搞清楚系统键到底有哪些。然而网上搜不到相关资料,MSDN中似乎说的是F10和Alt键。不过,感觉这个答案还是不是最准确的。
所以,就亲自用代码来验证一下即可。如果是系统键,则系统会优先处理。而系统要处理系统键,则在WM_SYSKEYDOWN消息中进行。而普通的按键,则在WM_KEYDOWN中进行。所以,我们来分别测试一下,将我们可能以为的按键来测试一番。
我们在文章《如何拦截和屏蔽F1到F12功能键(实现F10菜单功能键的拦截和屏蔽) 》已经得知,F10是系统键。如果屏蔽F也在文中分析了。
我们测试的其他的按键是否为系统键的方法也很简单,就是弹出一个消息框,显示对应的按键的名称。通过判断wParam参数中附带的虚拟键码即可。代码示例如下:
case WM_SYSKEYDOWN://系统键响应的消息
switch(wParam)
{
case VK_F10://F10是系统键,在此拦截
MessageBox(hwnd,_T("F10"),_T(""),0);
break;
case VK_MENU://系统优先
MessageBox(hwnd,_T("系统Alt键"),_T(""),0);
break;
}
return 0;
case WM_KEYDOWN://普通键响应的消息
switch(wParam)
{
case VK_CONTROL:
MessageBox(hwnd,_T("Ctrl键"),_T(""),0);
break;
case VK_MENU:
MessageBox(hwnd,_T("应用Alt键"),_T(""),0);
break;
}
return 0;
我们这里只给出了三个按键的测试代码,给出了代码如何写的例子。键盘的其他按键,你可以自己去补充测试。我已经测试了,发现,只有F10和Alt是经过WM_SYSKEYDOWN处理的。同时,Alt在WM_KEYDOWN消息也会被处理,不过WM_SYSKEYDOWN消息优先处理。系统处理后,就不给WM_KEYDOWN处理了。不过你拦截之后,就可以自己让WM_KEYDOWN消息接着处理。不过这个已经和系统无关了,是你自己的逻辑了。也就是说,Alt有双重身份,即使系统键,也是非系统键。只不过系统键的优先级更高。如果你想屏蔽Alt键,就要WM_SYSKEYDOWN中屏蔽。这个和F10的屏蔽是一样的原理。
那么最后的结论就是,系统键基本上只有两个,即Alt和F10。这两个按键的作用就是激活菜单的,为系统所用。Alt也可以用作普通的按键,可以自己和其他按键组合成快捷键。
下面是虚拟键码的定义列表:
//鼠标按键左右中键
#define VK_LBUTTON 0x01
#define VK_RBUTTON 0x02
#define VK_MBUTTON 0x04
//常用的按键
#define VK_BACK 0x08//退格键
#define VK_TAB 0x09//Tab键
#define VK_RETURN 0x0D//回车键
#define VK_SHIFT 0x10//Shift键
#define VK_CONTROL 0x11//Ctrl键
#define VK_MENU 0x12//Alt键
#define VK_CAPITAL 0x14//CapsLock大小写锁定键
#define VK_ESCAPE 0x1B//ESC键
//辅助编辑键
#define VK_SPACE 0x20//空格键
#define VK_PRIOR 0x21//PageUp键
#define VK_NEXT 0x22//PageDown键
#define VK_END 0x23//End键
#define VK_HOME 0x24//Home键
#define VK_LEFT 0x25//光标←键
#define VK_UP 0x26//光标↑键
#define VK_RIGHT 0x27//光标→键
#define VK_DOWN 0x28//光标↓键
#define VK_SNAPSHOT 0x2C//截屏快照,将当前屏幕画面以位图形式存入剪切板
#define VK_INSERT 0x2D//插入模式和覆盖模式切换键
#define VK_DELETE 0x2E//Delete键
/* 字母和数字的虚拟键码值就是ASCII编码值
* VK_0 - VK_9(0x30 - 0x39)
* VK_A - VK_Z(0x41 - 0x5A)
*/
//Windows徽标键,左右两个键
#define VK_LWIN 0x5B
#define VK_RWIN 0x5C
//数字键盘上的按键
#define VK_NUMPAD0 0x60
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A//乘号*
#define VK_ADD 0x6B//加号+
#define VK_SUBTRACT 0x6D//减号-
#define VK_DECIMAL 0x6E//小数点.
#define VK_DIVIDE 0x6F//除号/
//功能键
#define VK_F1 0x70
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
//F12之后的是预留的
#define VK_F13 0x7C
#define VK_F14 0x7D
#define VK_F15 0x7E
#define VK_F16 0x7F
#define VK_F17 0x80
#define VK_F18 0x81
#define VK_F19 0x82
#define VK_F20 0x83
#define VK_F21 0x84
#define VK_F22 0x85
#define VK_F23 0x86
#define VK_F24 0x87
以上列出的虚拟键码,我都标注了含义,你可以自行测试是否为系统键。对于这些虚拟键码,删掉了不常用的一些,有的你的键盘上都没有,就没有列举出来了。