Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi MFC:Ctrl-Shift don'的加速器;不行?_Winapi_Acceleratorkey - Fatal编程技术网

Winapi MFC:Ctrl-Shift don'的加速器;不行?

Winapi MFC:Ctrl-Shift don'的加速器;不行?,winapi,acceleratorkey,Winapi,Acceleratorkey,我配置了一些加速器,如果只使用Ctrl键,它可以正常工作,但是如果我将其设置为Shift+Ctrl,它就不工作了(甚至不会像Ctrl版本那样在MFC菜单中显示为快捷方式)。我用大写和小写字母尝试过的条目没有任何区别。这是加速器中的条目的外观: "R", ID_R1, VIRTKEY, CONTROL, NOINVERT "R", ID_R2, VIRTKEY, SHIFT, CONTR

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

"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
0000000000 2100D6 P WM\U KEYDOWN nVirtKey:VK\U控制重复:1扫描代码:1D扩展:0故障停机:0故障重复:0 fUp:0
0000000000 2100D6 S LVM_GETNEXTITEM iStart:-1个标志:已选择LVNI_
0000000000 2100D6 R LVM_GETNEXTITEM iIndex:-1
0000000000 2100D6 P WM\U KEYDOWN nVirtKey:VK\U SHIFT CREPATE:1扫描代码:2A扩展:0故障停机:0故障停机:0故障停机:0故障停机:0故障停机:0故障停机:0故障:0
0000000000 2100D6 S LVM_GETNEXTITEM iStart:-1个标志:已选择LVNI_
0000000000 2100D6 R LVM_GETNEXTITEM iIndex:-1
0000000000 2100D6 P WM_KEYUP nVirtKey:'R'重复:1扫描代码:13扩展:0故障:0故障:0故障:0故障:0故障:0故障:1
0000000000 2100D6 S LVM_GETNEXTITEM iStart:-1个标志:已选择LVNI_
0000000000 2100D6 R LVM_GETNEXTITEM iIndex:-1
0000000000 2100D6 P WM_KEYUP nVirtKey:VK_移位重复:1扫描代码:2A扩展:0故障:0故障:0故障:1故障:1故障:1
0000000000 2100D6 S LVM_GETNEXTITEM iStart:-1个标志:已选择LVNI_
0000000000 2100D6 R LVM_GETNEXTITEM iIndex:-1
0000000000 2100D6 P WM\U KEYUP nVirtKey:VK\U控制重复:1扫描代码:1D扩展:0故障停机:0故障重复:1 fUp:1
编辑:

甚至更多的数据,我在第178行的thrdcore.cpp中放置了一个条件断点,消息循环在该行(该行是
if(pState->m_msgCur.message!=WM_KICKIDLE&!afxpretransmessage(&(pState->m_msgCur))
)。断点是:
pState->m_msgCur.message==0x0100&&pState->m_msgCur.wParam==0x52
(R的WM_键)。当按下
R
Ctrl-R
时,断点会命中,而当按下
Ctrl-Shift-R
时,断点不会出现。在间谍追踪上面,R从来没有WM_键,只有向上键

编辑:

现在真的很奇怪了。我决定进入VS2017的键盘设置,看看是否有东西分配给了Ctrl-Shift-R,我按下它,什么也没发生,我尝试了任何其他字母,如Ctrl-Shift-T,效果很好。能用我的键盘吗?或者在Win10 x64中,当按下Ctrl-Shift键时,会吃掉R的WM_键


谢谢。

您应该在加速器表中使用大写字符:

"R",            ID_R2,        VIRTKEY, SHIFT, CONTROL, NOINVERT
要在菜单上显示快捷键,必须修改菜单项本身,如更改

MENUITEM "&New\tCtrl+N",                ID_FILE_NEW


加速器键和菜单项的标题名未更新的原因是注册表信息未更新

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

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

HKEY_当前_用户\软件\本地应用程序向导生成的应用程序

然后删除当前应用程序名的注册表信息,重新编译程序后它将正常工作

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

你可以参考:

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

这两种解决方案都适用于我。

虚拟密钥表示物理密钥,而不是字符。键盘上没有“小写r”键。键盘上的键是大写的R。当你按下它时,它碰巧会产生小写的R,但这不是虚拟键所代表的。我原本有“R”,但作为测试改为“R”。但是“R”版本也不起作用。它也不会显示在MFC菜单中,只有Ctrl-R版本。Ctrl-Shift版本应该是“VIRTKEY”还是其他版本?@RaymondChen使用间谍和条件断点更新原始消息。仅在R向上时从未收到WM_键下?关于寻找什么有什么提示吗?另一个讨论说Ctrl+Shift+N有效。这表明某些程序已将Ctrl+Shift+R注册为全局热键,该热键会覆盖您的加速器。@RaymondChen是否有办法(甚至没有文档记录)找到已注册的键序列?我刚刚修改了向导创建的应用程序,
File New
命令和
“N”,ID\u File\u New,VIRTKEY,Shift,CONTROL,NOINVERT
;它现在可以使用
Shift+Ctrl+N
,而不能使用默认的
Ctrl+N
。您一定是做错了什么菜单项现在已经按它应该的方式列出了(在MFC中是自动的),但按键仍然不起作用。当按下组合键时,原始问题更新为spy数据。是的,现在菜单项旁边显示了Ctrl-Shift-R,但按下这些键仍然不起作用,而Ctrl-R起作用。它是一个拆分窗口,左侧是CTreeView,右侧是CListView,顶部还有CMFCToolBar和CMFCToolBar。MessageMap位于CMInframe中。在拆分窗口下使用Shift-Ctrl是否有问题?我尝试过将活动窗格设置为一个或另一个窗格,但从未使用加速器获得OnID2调用。我在上面的原始问题中添加了间谍数据,还添加了条件断点结果,WM_KEYDOWN从未在Ctrl-Shift-R上为R接收到该结果。@user3161924 Ctrl-Shift-R在我测试后对我有效,您测试过其他键吗
int CMFCApplication1App::ExitInstance()
{
    //TODO: handle additional resources you may have added
    AfxOleTerm(FALSE);
    this->CleanState();
    return CWinAppEx::ExitInstance();
}