如何在MDI程序中禁用Ctrl + F6,Ctrl + Tab和Ctrl + F4

时间:2015-01-06 18:31:13

标签: winapi mfc keyboard-shortcuts

我需要禁用 Ctrl + F4 (关闭文档), Ctrl + F6 (下一个窗格)和Mb MDI程序中的 Ctrl + Tab (下一个文档)快捷方式。这些快捷方式由MFC(甚至Win32?)自动处理。

有一个简单的方法吗?我正在考虑拦截PreTranslateMessage中相应的击键,但这对我来说似乎更像是黑客攻击。

2 个答案:

答案 0 :(得分:1)

TranslateMDISysAccel Win32函数负责将这些按键转换为WM_SYSCOMMAND条消息。它被称为"标准的一部分" MDI消息循环(伪代码):

while (GetMessage())
{
    if (!TranslateMDISysAccel() && !TranslateAccelerator())
    {
        TranslateMessage();
        DispatchMessage();
    }
}

因此,在纯Win32程序中,如果您不希望处理这些密钥,解决方案就是不要将TranslateMDISysAccel作为邮件循环的一部分进行调用。

我假设在基于MFC的程序中,这个细节对你来说是隐藏的。那么覆盖PreTranslateMessage函数似乎是适当的解决方案。对这种技术进行了很好的讨论here

答案 1 :(得分:1)

如果您想简化,请在您的IDR_MAINFRAME加速器表中添加这些组合键的条目,并使它们执行未定义的命令或路由到不执行任何操作的命令。

当调用CMDIFrameWnd :: PreTranslateMessage()函数时,它将拦截这些加速器并发出应用程序将忽略的命令。永远不会为那些热键组合调用TranslateMDISysAccel()函数,因为资源ACCEL表中有条目。