在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?
Posted
技术标签:
【中文标题】在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?【英文标题】:Detecting CTRL inside CEdit::OnChar and testing nChar value? 【发布时间】:2021-01-10 19:28:15 【问题描述】:我从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);
但是,关于如何检测按键,我有两个问题:
-
是否可以检测到从
OnChar
内部按下的CTRL 而无需使用GetKeyState
?
是否有任何常数可以与"b"
(2) 和"i"
(9) 进行比较?从调试到处理程序时,我才知道我需要使用这些数值。
【问题讨论】:
【参考方案1】:正如您所指出的,对于 Ctrl + “a letter”(与大小写无关)的键盘输入,OnChar
的 nChar
参数的值将是 ASCII “control- key”值,1(用于“a”)到 26(用于“z”)。
回答你的第二点:搜索<WinUser.h>
头文件显示没有VK_xxx
标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+M(十进制 13)等价于 Return kbd> 或 Enter,并且表头有#define VK_RETURN 0x0D
;此外,对于您的 特定 案例之一, Ctrl+I (9) 是 ASCII TAB
字符,相应的标题,具有#define VK_TAB 0x09
定义。
虽然现在 Ctrl+B ASCII 码 (0x02) 的使用要少得多(STX
,或“文本开头”),但仍使用该值通过 Windows 鼠标右键 (#define VK_RBUTTON 0x02
)。
所以,回答您的第一点:是的,您需要检查GetKeyState(VK_CONTROL)
!否则,右键单击可能会给您一个错误的 Ctrl+B 并且 Tab 键会给您一个错误的 Ctrl+我.
此外,尽管除了您自己的调查外,我没有“确凿证据”,但我认为在按住 Control 键时右键单击将为nChar
生成不同的值(即not 2),并且 Ctrl+Tab 将生成一个不同于 Tab 单独的nChar
。
【讨论】:
以上是关于在 CEdit::OnChar 中检测 CTRL 并测试 nChar 值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript 检测 Ctrl+V、Ctrl+C?
如何使用 JavaScript 检测 Ctrl+V、Ctrl+C?