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

如您所注意到的,对于Ctrl+ "一个字母"(与大小写无关)的键盘条目OnCharnChar参数的值将是 ASCII"控制键"值,1(表示"a")到 26(对于"z")。

回答你的第二点:搜索<WinUser.h>头文件没有显示这些VK_xxx标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等效于ReturnEnter,标头具有#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 将生成与单独Tab不同的nChar

最新更新