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

Posted

技术标签:

【中文标题】在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?【英文标题】:Detecting CTRL inside CEdit::OnChar and testing nChar value? 【发布时间】:2021-01-10 19:28:15 【问题描述】:

我从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);

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

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

【问题讨论】:

【参考方案1】:

正如您所指出的,对于 Ctrl + “a letter”(与大小写无关)的键盘输入,OnCharnChar 参数的值将是 ASCII “control- key”值,1(用于“a”)到 26(用于“z”)。

回答你的第二点:搜索&lt;WinUser.h&gt; 头文件显示没有VK_xxx 标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等价于 Return kbd> 或 Enter,并且表头有#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+B 并且 Tab 键会给您一个错误的 Ctrl+.

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

【讨论】:

以上是关于在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 检测 Ctrl+V、Ctrl+C?

如何使用 JavaScript 检测 Ctrl+V、Ctrl+C?

在WPF DataGrid中未检测到CTRL + C.

在 MouseDown 事件处理程序中检测 Ctrl+Left(鼠标按钮)

检测Ctrl +单击按钮并单击按钮[复制]

如何在操作系统检测到它之前或之后检测到 Ctrl-Alt-Del?