C#快捷键下划线未在构建的应用程序中显示

我的.Net 4.0 ToolStripMenuItem标题有一个小问题。
我希望它强调项目文本中的快捷方式(访问)关键字母。
我在项目文本字段中使用了&符号:’&New map’,它在编辑器中看起来很好:
在此处输入图像描述

但是,当我构建应用程序时,下划线消失:
在此处输入图像描述

有谁知道它为什么会发生以及如何在构建的表单中制作强调显示?

如其他答案所述,这是默认行为。 仅在按下ALT键后才会显示加速器。

但是,似乎可以强制Windows不断显示加速键:

[System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int SystemParametersInfo(int uAction, int uParam, int lpvParam, int fuWinIni); private const int SPI_SETKEYBOARDCUES = 4107; //100B private const int SPIF_SENDWININICHANGE = 2; [STAThread] static void Main() { // always show accelerator underlines SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 1, 0); Application.Run(new MainForm()); } 

在这里找到。

正如我刚刚validation的那样(在评论中提出ken2k的建议之后),这不幸地影响了整个系统。 因此需要进行一些调整: 1)在启动时记住SPI_SETKEYBOARDCUES当前值2)在退出时将设置重置为此值, 3)创建域exception处理程序,以确保设置始终重置。

不幸的是,即使最后一个参数为零,这种行为也是如此,即使文档说:

如果您不想更新用户配置文件或广播WM_SETTINGCHANGE消息,则此参数可以为零

简单版本当然只是:

 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int SystemParametersInfo(int uAction, int uParam, int lpvParam, int fuWinIni); private const int SPI_SETKEYBOARDCUES = 4107; //100B private const int SPIF_SENDWININICHANGE = 2; [STAThread] static void Main() { // always show accelerator underlines SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 1, 0); Application.Run(new MainForm()); SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, 0, 0); } 

在本回答中,您可以找到有关如何仅在本地为您的应用程序实现此目的的代码示例。

这是Windows的默认行为。 除非您使用键盘调用菜单,否则将隐藏加速键。 按ALT查看加速器。 请注意,您可以在其他程序中看到此行为,例如尝试记事本。

如果要更改自己计算机上的行为,可以将系统配置为始终从轻松访问中心显示加速键。 该设置位于“ 使键盘更易于使用”下 ,在我的Windows 7机器上如下所示:

在此处输入图像描述

请注意,强烈建议您让用户选择是否隐藏加速键。 换句话说,您的应用程序已经正常运行,并且在我看来,您不应该对其当前行为进行任何更改。

自Windows Vista(我认为)以来,默认情况下不显示快捷方式提示。 您需要按Alt键才能显示它们。 在辅助function设置中,有一个全局系统设置可以更改该行为。

其他答案解释了您正在观察的行为。 我不会重复任何一点。

为了完整起见,并扩展BartoszKP的答案 ,有一种方法可以以应用程序本地的方式控制加速键的隐藏。 具体来说就是WM_UPDATEUISTATE消息。 传递UIS_CLEARUISF_HIDEACCEL 。 我对这个问题的回答显示了如何做到这一点: 在所有时间显示热键 。

Windows默认情况下不再显示这些快捷方式。 您可以通过进入“控制面板”中的“轻松访问中心”并在“使键盘更易于使用”部分选中“下划线键盘快捷键和访问键”选项重新启用它们,虽然这显然只影响计算机’继续。