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

问题描述 投票:0回答:2

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

有一个简单的方法吗?我本想拦截

PreTranslateMessage
中相应的击键,但这对我来说似乎更像是一种黑客攻击。

winapi mfc keyboard-shortcuts
2个回答
1
投票

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

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

因此,在纯 Win32 程序中,如果您不希望处理这些键,解决方案就是不调用

TranslateMDISysAccel
作为消息循环的一部分。

我假设在基于 MFC 的程序中,这个细节对您是隐藏的。看来重写

PreTranslateMessage
函数将是合适的解决方案。 这里对这项技术进行了很好的讨论。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.