检测 CEdit::OnChar 内的 CTRL 并测试 nChar 值?
Detecting CTRL inside CEdit::OnChar and testing nChar value?
我从 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);
}
但是,关于如何检测按键,我有两个问题:
- 是否可以检测 CTRL 从
OnChar
内部按下而不需要使用 GetKeyState
?
- 是否有任何常数可以与
"b"
(2) 和 "i"
(9) 进行比较?我只知道我需要使用调试处理程序时的那些数值。
正如您所注意到的,OnChar
的 nChar
参数的值对于 Ctrl +“字母”的键盘输入(独立于case) 将是 ASCII“控制键”值,1(对于“a”)到 26(对于“z”)。
回答您的 第二 点:通过 <WinUser.h>
头文件的搜索显示没有 VK_xxx
这些标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等同于Return或输入,表头有#define VK_RETURN 0x0D
;此外,对于您的 specific 案例之一,Ctrl+I (9) 是 ASCII TAB
字符,因此标题具有 #define VK_TAB 0x09
定义。
尽管 Ctrl+B ASCII 码 (0x02) 现在很少使用了(STX
,或者“ Start of Text"),Windows 使用该值作为鼠标右键 (#define VK_RBUTTON 0x02
)。
因此,要回答您的 第 点:是的,您需要进行 GetKeyState(VK_CONTROL)
检查!否则,右键单击可能会给您一个错误的 Ctrl+B 和 Tab 键会给出一个错误的 Ctrl+I.
此外,虽然我没有 'hard evidence' 除了您自己的调查,但我认为在按住 Control 键 时右键单击 会生成不同的值对于 nChar
(即 not 2),并且 Ctrl+Tab 将生成一个 nChar
与单独 Tab 不同。
我从 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);
}
但是,关于如何检测按键,我有两个问题:
- 是否可以检测 CTRL 从
OnChar
内部按下而不需要使用GetKeyState
? - 是否有任何常数可以与
"b"
(2) 和"i"
(9) 进行比较?我只知道我需要使用调试处理程序时的那些数值。
正如您所注意到的,OnChar
的 nChar
参数的值对于 Ctrl +“字母”的键盘输入(独立于case) 将是 ASCII“控制键”值,1(对于“a”)到 26(对于“z”)。
回答您的 第二 点:通过 <WinUser.h>
头文件的搜索显示没有 VK_xxx
这些标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等同于Return或输入,表头有#define VK_RETURN 0x0D
;此外,对于您的 specific 案例之一,Ctrl+I (9) 是 ASCII TAB
字符,因此标题具有 #define VK_TAB 0x09
定义。
尽管 Ctrl+B ASCII 码 (0x02) 现在很少使用了(STX
,或者“ Start of Text"),Windows 使用该值作为鼠标右键 (#define VK_RBUTTON 0x02
)。
因此,要回答您的 第 点:是的,您需要进行 GetKeyState(VK_CONTROL)
检查!否则,右键单击可能会给您一个错误的 Ctrl+B 和 Tab 键会给出一个错误的 Ctrl+I.
此外,虽然我没有 'hard evidence' 除了您自己的调查,但我认为在按住 Control 键 时右键单击 会生成不同的值对于 nChar
(即 not 2),并且 Ctrl+Tab 将生成一个 nChar
与单独 Tab 不同。