如何在 MDI 程序中禁用 Ctrl+F6、Ctrl+Tab 和 Ctrl+F4
How to disable Ctrl+F6, Ctrl+Tab and Ctrl+F4 in an MDI program
我需要禁用Ctrl+F4(关闭文档),Ctrl+[ MFC MDI 程序中的 =5=]F6(下一个窗格)和 Ctrl+Tab(下一个文档)快捷键。这些快捷方式由 MFC(甚至 Win32?)自动处理。
有没有简单的方法可以做到这一点?我正在考虑拦截 PreTranslateMessage
中相应的击键,但这对我来说更像是一个 hack。
TranslateMDISysAccel
Win32 函数负责将这些按键转换为 WM_SYSCOMMAND
消息。它被称为 "standard" MDI 消息循环(伪代码)的一部分:
while (GetMessage())
{
if (!TranslateMDISysAccel() && !TranslateAccelerator())
{
TranslateMessage();
DispatchMessage();
}
}
因此,在纯 Win32 程序中,如果您不想处理这些键,解决方案就是不调用 TranslateMDISysAccel
作为消息循环的一部分。
我假设在基于 MFC 的程序中这个细节对您是隐藏的。那么似乎覆盖 PreTranslateMessage
函数将是合适的解决方案。对这项技术有很好的讨论here。
如果你想让它变得简单,在你的 IDR_MAINFRAME 加速器 table 中,为这些组合键添加条目,并让它们执行一个未定义的命令或路由到一个命令什么都不做。
当调用 CMDIFrameWnd::PreTranslateMessage() 函数时,它将拦截这些加速器并发出您的应用程序将忽略的命令。永远不会为这些热键组合调用 TranslateMDISysAccel() 函数,因为在您的资源 ACCEL table.
中有条目
我需要禁用Ctrl+F4(关闭文档),Ctrl+[ MFC MDI 程序中的 =5=]F6(下一个窗格)和 Ctrl+Tab(下一个文档)快捷键。这些快捷方式由 MFC(甚至 Win32?)自动处理。
有没有简单的方法可以做到这一点?我正在考虑拦截 PreTranslateMessage
中相应的击键,但这对我来说更像是一个 hack。
TranslateMDISysAccel
Win32 函数负责将这些按键转换为 WM_SYSCOMMAND
消息。它被称为 "standard" MDI 消息循环(伪代码)的一部分:
while (GetMessage())
{
if (!TranslateMDISysAccel() && !TranslateAccelerator())
{
TranslateMessage();
DispatchMessage();
}
}
因此,在纯 Win32 程序中,如果您不想处理这些键,解决方案就是不调用 TranslateMDISysAccel
作为消息循环的一部分。
我假设在基于 MFC 的程序中这个细节对您是隐藏的。那么似乎覆盖 PreTranslateMessage
函数将是合适的解决方案。对这项技术有很好的讨论here。
如果你想让它变得简单,在你的 IDR_MAINFRAME 加速器 table 中,为这些组合键添加条目,并让它们执行一个未定义的命令或路由到一个命令什么都不做。
当调用 CMDIFrameWnd::PreTranslateMessage() 函数时,它将拦截这些加速器并发出您的应用程序将忽略的命令。永远不会为这些热键组合调用 TranslateMDISysAccel() 函数,因为在您的资源 ACCEL table.
中有条目