1

我从中获得了自己的控制权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. 是否可以在无需使用的情况下从内部检测到CTRL被按下?OnCharGetKeyState
  2. 是否有任何常数可以与"b"(2) 和"i"(9) 进行比较?我只知道从调试到处理程序时我需要使用这些数值。
4

1 回答 1

2

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

回答你的第二点:通过<WinUser.h>头文件搜索显示没有VK_xxx这些标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+ M(十进制 13)等价于Returnor Enter,并且标头具有#define VK_RETURN 0x0D; 此外,对于您的一种特定情况,Ctrl+ I(9) 是 ASCIITAB字符,因此标​​题具有#define VK_TAB 0x09定义。

尽管现在Ctrl+ BASCII 码 (0x02) 的使用要少得多(STX或“文本开头”),但 Windows 使用该值作为鼠标右键 ( #define VK_RBUTTON 0x02)。

因此,回答您的第一点:是的,您需要进行GetKeyState(VK_CONTROL)检查!否则,右键单击可能会给您一个错误的Ctrl+ B,而该Tab键将给出一个错误的Ctrl+ I

此外,尽管除了您自己的调查外,我没有“确凿的证据”,但我认为在 Control 键按下时右键单击会产生不同的值nChar(即不是2),而Ctrl+Tab会产生nCharTab独自的。

于 2021-01-10T21:09:48.760 回答