visual-c++ - 在 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);
}
但是,关于如何检测按键,我有两个问题:
- 是否可以在无需使用的情况下从内部检测到CTRL被按下?
OnChar
GetKeyState
- 是否有任何常数可以与
"b"
(2) 和"i"
(9) 进行比较?我只知道从调试到处理程序时我需要使用这些数值。
解决方案
正如您所指出的,对于 +“a letter”(与大小写无关)的键盘输入,nChar
参数的值将是 ASCII“control-key”值,1(对于“a”)到 26(对于“z ”)。OnChar
Ctrl
回答你的第二点:通过<WinUser.h>
头文件搜索显示没有VK_xxx
这些标记;但是,请注意,其中一些控制代码(按照惯例)用于其他操作:Ctrl+ M(十进制 13)等价于Returnor 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会产生nChar
与Tab独自的。
推荐阅读
- html - 我的导航栏仅适用于索引页面。如果我不在索引页面上,我无法导航回任何其他页面
- database - 向文件添加权限 Oracle Data Modeller MacOs
- flutter - 如何从另一个小部件更改有状态小部件的变量?
- javascript - 正则表达式最多 4 位带点,只接受数字并用点分隔每千
- c# - Azure 函数从 azure devops 存储库中读取文件
- api - NextJS Stripe Webhook 原始正文
- python - 如何根据多个条件在熊猫数据框中插入列?
- python - 将某些列滑动 1 并插入新值
- javascript - 如何将日期转换为unix时间?
- reactjs - 传播运算符打字稿在反应道具中返回数组