在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?

问题描述

我从 CEdit 派生出自己的控件,它的行为符合我的预期:

#define IsSHIFTpressed() ( (GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1))) != 0   )

void CEditEx::OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)
{
    if (IsCTRLpressed() && nChar == 2)
    {
        // Do something
        return;
    }

    if (IsCTRLpressed() && nChar == 9)
    {
        // Do something
        return;
    }

    CEdit::OnChar(nChar,nRepCnt,nFlags);
}

但是,我有两个关于如何检测按键按下的问题:

  1. 是否可以在不需要使用 OnChar 的情况下检测从 GetKeyState 内部按下 CTRL
  2. 是否有任何常数可以与 "b" (2) 和 "i" (9) 进行比较?我只知道我需要在调试处理程序时使用这些数值。

解决方法

正如您所指出的,对于 Ctrl +“一个字母”(独立于大小写)的键盘输入,nCharOnChar 参数的值将是ASCII“控制键”值,1(对于“a”)到 26(对于“z”)。

回答您的第二点:搜索 <WinUser.h> 头文件没有显示这些 VK_xxx 标记;但是,请注意其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等价于 Return回车,头部有#define VK_RETURN 0x0D;此外,对于您的特定情况之一,Ctrl+I (9) 是 ASCII TAB 字符,而标题,相应地,具有 #define VK_TAB 0x09 定义。

尽管 Ctrl+B ASCII 代码 (0x02) 的使用率在这些天(STX,或“文本的开始”)少得多,但该值Windows 将其用于鼠标右键 (#define VK_RBUTTON 0x02)。

因此,要回答您的第一点:是的,您需要检查 GetKeyState(VK_CONTROL)!没有它,右键单击可能会给您一个错误的 Ctrl+BTab 键将给您一个错误的 Ctrl+I.

此外,尽管除了您自己的调查之外,我没有任何“确凿的证据”,但我认为在按下 Control 键时右键单击会为 nChar 生成不同的值(即 not 2),并且 Ctrl+Tab 将生成与 Tab不同的 nChar > 一个人。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...