我从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);
}
但是,关于如何检测按键,我有两个问题:
- 是否可以在无需使用
GetKeyState
的情况下从OnChar
内部检测到按下CTRL? - 是否有任何常数可以与
"b"
(2) 和"i"
(9) 进行比较?我只知道我需要使用调试处理程序时的那些数值。
如您所注意到的,对于Ctrl+ "一个字母"(与大小写无关)的键盘条目OnChar
的nChar
参数的值将是 ASCII"控制键"值,1(表示"a")到 26(对于"z")。
回答你的第二点:搜索<WinUser.h>
头文件没有显示这些VK_xxx
标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等效于Return或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 将生成与单独Tab不同的nChar
。