键盘消息分为击键消息和字符消息。而击键消息就是指当你按下一个键时它是哪个键。
一般有以下四个击键消息:
WM_KEYDOWN、WM_SYSKEYDOWN、WM_KEYUP、WM_SYSKEYUP。这里分为系统击键消息和非系统击键消息。而非系统击键消息是我们常用的。当你按下一个键的时候就会产生一个WM_KEYDOWN消息,但是此时你还不懂他按下的是哪个键,只知道他按下了一个键,接下来就用wParam参数所附带的消息来判断是哪个键被按下,这个参数所附带的消息一般以VK_开头,就是虚拟键的意思。
虚拟键码:
虚拟键代码存储在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOEN、WM_SYSKEYUP消息的wParam参数中
经常使用的大多数虚拟键代码命名是以VK_开头的,它定义在WINUSER.H头文件中 lParam消息参数包含了帮助理解击键的其他有用信息
比如发送给窗口刚才一个键盘消息:SendMessage(hwnd,WM_KEYDOWN,VK_RETURN,0);这表示我按下了一个回车键。
还有一个比较重要的就是转义状态,它判定你是否按下了转义键(Shift键、Ctrl键和Alt)或切换键(Caps Lock、Num Lock键和Scroll Lock键)。可以调用如下函数来获取它的状态。
返回值如果高位为1(结果为-1)则表示按下否则是抬起
如果是低位为1表示像Caps Lock这类键被按下.
SHORT GetKeyState(
int nVirtKey //虚拟键
);
nVrtKey:定义一虚拟键。若要求的虚拟键是字母或数字(A~Z,a~z或0~9),nVirtKey必须被置为相应字符的ASCII码值,对于其他的键,nVirtKey必须是一虚拟键码。
例如:
//定义一个16位的最高位为1的宏
#define SHIFTED 0x8000
//[其它代码]
case WM_KEYDOWN:
//如果按下返回一个SHORT16位的高位为1
iState = GetKeyState(VK_CONTROL);
switch (wParam)
{
case 'A':
//如果最高位都为1则表示被按下了。
if (iState & SHIFTED)
{
MessageBox(nullptr, L"你按下了Ctrl键+A!", L"", MB_OK);
}
break;
default:
break;
}
return 0;
还有一个判断按键状态的函数
这个函数可以独立于键盘消息之外,随时判断键盘按键状态.
SHORT GetAsyncKeyState(
int vKey
);
以下是一些虚拟键的键码:
VK_LBUTTON 鼠标左键 0x01
VK_RBUTTON 鼠标右键 0x02
VK_CANCEL Ctrl + Break 0x03
VK_MBUTTON 鼠标中键 0x04
VK_BACK Backspace 键 0x08
VK_TAB Tab 键 0x09
VK_RETURN 回车键 0x0D
VK_SHIFT Shift 键 0x10
VK_CONTROL Ctrl 键 0x11
VK_MENU Alt 键 0x12
VK_PAUSE Pause 键 0x13
VK_CAPITAL Caps Lock 键 0x14
VK_ESCAPE Esc 键 0x1B
VK_SPACE 空格键 0x20
VK_PRIOR Page Up 键 0x21
VK_NEXT Page Down 键 0x22
VK_END End 键 0x23
VK_HOME Home 键 0x24
VK_LEFT 左箭头键 0x25
VK_UP 上箭头键 0x26
VK_RIGHT 右箭头键 0x27
VK_DOWN 下箭头键 0x28
VK_SNAPSHOT Print Screen 键 0x2C
VK_INSERT Insert 键 0x2D
VK_DELETE Delete 键 0x2E
‘0’ – ‘9’ 数字 0 - 9 0x30 - 0x39
‘A’ – ‘Z’ 字母 A - Z 0x41 - 0x5A
VK_LWIN 左WinKey(104键盘才有) 0x5B
VK_RWIN 右WinKey(104键盘才有) 0x5C
VK_APPS AppsKey(104键盘才有) 0x5D
VK_NUMPAD0 小键盘 0 键 0x60
VK_NUMPAD1 小键盘 1 键 0x61
VK_NUMPAD2 小键盘 2 键 0x62
VK_NUMPAD3 小键盘 3 键 0x63
VK_NUMPAD4 小键盘 4 键 0x64
VK_NUMPAD5 小键盘 5 键 0x65
VK_NUMPAD6 小键盘 6 键 0x66
VK_NUMPAD7 小键盘 7 键 0x67
VK_NUMPAD8 小键盘 8 键 0x68
VK_NUMPAD9 小键盘 9 键 0x69
VK_F1 - VK_F24 功能键F1 – F24 0x70 - 0x87
VK_NUMLOCK Num Lock 键 0x90
VK_SCROLL Scroll Lock 键 0x91
字符消息,顾名思义就是当你按下某个键的时候,传递一个什么样的字符。比如按下A就传递一个‘A’字符或者‘a’。
字符消息也分为四类:
WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR四类字符消息
大多数情况下Windows会忽略其他三种字符消息,只处理WM_CHAR消息。
字符消息里面的wParam参数变了,不在是虚拟键码,而是ANSI或者Unicode字符码。
例如:
//字符消息
case WM_CHAR:
switch (wParam)
{
//当仅仅只按下键盘A的时候会触发这个消息
case 'a':
MessageBox(nullptr, L"a!", L"", MB_OK);
break;
//当按下Caps Lock锁定大写字母的时候再按下A会触发这个
//或者按下Shift+A也会触发这个键
case 'A':
MessageBox(nullptr, L"A!", L"", MB_OK);
break;
default:
break;
}
return 0;
把Tab键、回车键、空格键、和Esc键看作控制字符。
例如:
switch (wParam)
{
case '27':
MessageBox(nullptr, L"你按下了空格键", L"", MB_OK);
break;
case '\t':
MessageBox(nullptr, L"你按下了Tab键", L"", MB_OK);
break;
case '\n':
MessageBox(nullptr, L"你按下了换行键", L"", MB_OK);
break;
case '\r':
MessageBox(nullptr, L"你按下了回车键", L"", MB_OK);
break;
default:
break;
}
有一些需要与之对应的ASCII值,就是ASCII表。
插入符号的函数:
1.该函数为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口。插入标记的形状。可以是线、块或位图。
BOOL CreateCaret(
HWND hWnd, //窗口句柄
HBITMAP hBitmap, //位图句柄
int nWidth, //宽度
int nHeight //高度
);
2.该函数将插入标记移动到指定的坐标上。
BOOL SetCaretPos(
int X,
int Y
);
3.显示插入符号
BOOL ShowCaret(
HWND hWnd
);
4.隐藏插入符号
BOOL HideCaret(
HWND hWnd
);
5.销毁插入符号
BOOL DestroyCaret(void);