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

Visual c++ 在CEdit::OnChar中检测CTRL并测试nChar值?,visual-c++,mfc,cedit,Visual C++,Mfc,Cedit,我从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) {

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

#define isshift pressed()((GetKeyState(VK_SHIFT)和(1)正如您所注意到的,对于Ctrl+“a字母”(独立于大小写)的键盘输入,
OnChar
参数的值将是ASCII“控制键”值,1(表示“a”)到26(表示“z”)

回答你的第二点:搜索
头文件不会显示这些标记的
VK_xxx
标记;但是,请注意,某些控制代码(按惯例)用于其他操作:Ctrl+M(十进制13)相当于Return或Enter,并且标头具有
#define VK_Return 0x0D
;此外,对于您的一种特定情况,Ctrl+I(9)是ASCII
选项卡
字符,因此标头具有
#define VK_选项卡0x09
定义

尽管Ctrl+B ASCII码(0x02)现在很少使用(
STX
,或“文本开始”),但Windows在鼠标右键(
#define VK_RBUTTON 0x02
)上使用了该值

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

此外,尽管除了您自己的调查之外,我没有任何“确凿证据”,但我认为在按住控制键的同时单击鼠标右键将为
nChar
(即不是2)生成不同的值,并且Ctrl+Tab将生成与单独使用Tab不同的
nChar