0

我配置了一些加速器,如果只使用Ctrl键它可以正常工作,但如果我让它Shift+Ctrl它不起作用(甚至不会在 MFC 菜单中显示为Ctrl版本的快捷方式)。我用大写和小写字母尝试过的条目没有区别。这是加速器中的条目的样子:

"R",            ID_R1,        VIRTKEY, CONTROL, NOINVERT
"R",            ID_R2,        VIRTKEY, SHIFT, CONTROL, NOINVERT

我究竟做错了什么?

编辑:我在上面写了“R”大写,因为两个答案都在谈论这个问题,但我最初有“R”,在放弃并在这里询问之前只改为“r”。但是“R”也不适用于 Ctrl-Shift-R,而 Ctrl-R 可以正常工作吗?

编辑:使用 Spy x64 并检查主窗口,永远不要发送命令。如果我转到拆分器窗口右侧的列表视图并按此顺序按 Ctrl-Shift-R,则生成的唯一内容是:

<000041> 00000000002100D6 P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000042> 00000000002100D6 S LVM_GETNEXTITEM iStart:-1 flags:LVNI_SELECTED
<000043> 00000000002100D6 R LVM_GETNEXTITEM iIndex:-1
<000044> 00000000002100D6 P WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000045> 00000000002100D6 S LVM_GETNEXTITEM iStart:-1 flags:LVNI_SELECTED
<000046> 00000000002100D6 R LVM_GETNEXTITEM iIndex:-1
<000047> 00000000002100D6 P WM_KEYUP nVirtKey:'R' cRepeat:1 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:1
<000048> 00000000002100D6 S LVM_GETNEXTITEM iStart:-1 flags:LVNI_SELECTED
<000049> 00000000002100D6 R LVM_GETNEXTITEM iIndex:-1
<000050> 00000000002100D6 P WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<000051> 00000000002100D6 S LVM_GETNEXTITEM iStart:-1 flags:LVNI_SELECTED
<000052> 00000000002100D6 R LVM_GETNEXTITEM iIndex:-1
<000053> 00000000002100D6 P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:1 fUp:1

编辑:

甚至更多数据,我在 thrdcore.cpp 的第 178 行放置了一个条件断点,消息循环所在的位置(行是if (pState->m_msgCur.message != WM_KICKIDLE && !AfxPreTranslateMessage(&(pState->m_msgCur))))。断点是:pState->m_msgCur.message==0x0100 && pState->m_msgCur.wParam==0x52(WM_KEYDOWN for R)。当按下RCtrl-R断点命中时,按下Ctrl-Shift-R断点时不会发生。在间谍跟踪之上,R 从来没有 WM_KEYDOWN,只有一个向上?

编辑:

现在真的越来越奇怪了。我决定进入 VS2017 的键盘设置,看看是否有分配给 Ctrl-Shift-R 的东西,我按下它并没有任何反应,我尝试任何其他字母,如 Ctrl-Shift-T,它工作正常。可以通过我的键盘吗?或者当按下 Ctrl-Shift 时,Win10 x64 中更深层次的东西正在为 R 吃掉 WM_KEYDOWN?

谢谢。

4

2 回答 2

1

加速键和菜单项的标题名称没有更新的原因是注册表信息没有更新。

有两种解决方案供您参考:

首先,您可以手动删除注册表中的信息。您可以进入注册表区域:

HKEY_CURRENT_USER\SOFTWARE\Local AppWizard 生成的应用程序

然后删除你当前应用名称的注册表信息,重新编译程序后就可以正常工作了。

第二种方法,可以通过在函数中添加CleanState()函数来清除注册表信息ExitInstance()。重启程序后,会更新当前程序的按键信息和菜单栏信息。

你可以参考:

int CMFCApplication1App::ExitInstance()
{
    //TODO: handle additional resources you may have added
    AfxOleTerm(FALSE);
    this->CleanState();
    return CWinAppEx::ExitInstance();
}

两种解决方案都对我有用。

于 2020-11-19T08:37:17.487 回答
0

您应该在快捷键表中使用大写字符:

"R",            ID_R2,        VIRTKEY, SHIFT, CONTROL, NOINVERT

要在菜单上显示快捷键,您必须修改菜单项本身,例如更改

MENUITEM "&New\tCtrl+N",                ID_FILE_NEW

MENUITEM "&New\tCtrl+Shift+N",          ID_FILE_NEW
于 2020-11-18T22:12:52.993 回答