您的位置:首页 > 其它

Windows程序设计--击键消息和字符消息

2015-12-16 14:18 363 查看
键盘消息分为击键消息和字符消息。而击键消息就是指当你按下一个键时它是哪个键。

一般有以下四个击键消息:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: