MFC-键盘消息_系统消息

键盘消息 

系统消息:
    ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。
    WM_SYSKEYDOWN       按下系统键
    WM_SYSKEYUP             松开系统键
    WM_SYSCHAR              输入一个系统字符

   WM_SYSDEANCHAR     输入一个系统死字符

 

    说明:不可产生显示字符的一般都是系统键;

非系统消息:
    是由我们自己加上去的,
    WM_KEYDOWN      按下非系统键
    WM_KEYUP            松开非系统键
    WM_CHAR              输入一个非系统字符

   WM_DEADCHAR      输入一个非系统死字符

 

说明:死字符指的是本身不能显示,但可以修改其他字符的字符;

按键和松开按键消息通常是成对出现的:

当按键按下,松开时,产生三条消息,<按下按键消息><字符消息><松开按键消息>

当用户按键,按住键一定的时间时键盘就会启动重覆性特性,系统就会产生一系列的 WM_KEYDOWN 或者 WM_SYSKEYDOWN消息

在用户释放按键时,才产生一条 WM_KEYUP 或 WM_SYSKEYUP

当用户按下键盘的某一按键时,首先产生WM_KEYDOWN消息,由该响应函数中的 TranslateMessage 函数,翻译成 ANSI 字符集之后再响应 WM_CHAR 消息,再响应 WM_KEYUP 消息;


MFC-键盘消息_大小写_02

 

 

 

 实例:WM_KEYDOWN, WM_KEYUP 键盘消息

WM_KEYDOWN响应所有按键消息(Alt键///Print Screen SysRq截屏键不响应)

1.添加WM_KEYDOWN, WM_KEYUP 键盘消息

右击窗口-->类向导---添加2个消息

2.代码

void CMFCtestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  //按下非系统键
//nChar     是虚拟键吗或ASCII吗
//nRepCnt   重复计数(用户按住键引起的重复击键数目)【实测:返回的值都是1,不知为何?】
//nFlags    指定了扫描码、暂态键码、原来的键状态和上下文代码,如下面的列表所示:
//          0-7 扫描码(依赖于OEM的值)。高位字的低字节
//          8 扩展键,比如功能键或数字键盘上的键(如果它时扩展键则为1)
//          9-10 未使用
//          11-12 Windows内部使用
//          13 上下文代码(如果按下键时ALT键时被按下的,则为1;否则为0)
//          14 原来的键状态(如果在调用之前键时按下的,则为1;如果键是弹起的,则为0)
//          15 暂态(如果键正在被释放,则为1;如果键正被按下,则为0)
{
    
    if (nChar == 66)   //如果按下的B键
        //66  是B(大写)的ASCII吗
    {
        WriteConsole(hStdout, ch, len, NULL, NULL);//在控制台输出
        str1.Format(_T("%d"), nRepCnt);  //把数值转换成字符串
        str = str1 + _T("\r\n");
        WriteConsole(hStdout, str, _tcslen(str), NULL, NULL);



    }

    CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}

 

WM_CHAR消息

WM_CHAR消息只响应字符按键和部分控制符
有很多控制字符不响应 不响应的键如下:Tab键 Caps Lock大小写切换键 ESC键 F1~F12   SHIFT   CTRL    ALT   方向键   方向键上方键盘区    Num Lock键

WM_CHAR区分大小写和SHIFT+数字,而WM_KEYDOWN只返回大写字母没有SHIFT作用

注意:如果想要主窗体响应WM_CHAR 消息,必须重载PreTranslateMessage来相应的实现

BOOL CMFCApplication9Dlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO:  在此添加专用代码和/或调用基类
 
    if (pMsg->message == WM_CHAR && pMsg->wParam >= '0' && pMsg->wParam <= '9')
    {
        CString a;
        a.Format(L"%c", pMsg->wParam);
        MessageBox(a);
    }
 
    return CDialogEx::PreTranslateMessage(pMsg);
}