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

键盘消息分为击键消息和字符消息。而击键消息就是指当你按下一个键时它是哪个键。
一般有以下四个击键消息:
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);

你可能感兴趣的:(windows,设计,wm)