【问题标题】:C# shortcut key underscore not displayed in built applicationC#快捷键下划线不显示在构建的应用程序中
【发布时间】:2014-01-03 12:52:05
【问题描述】:

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

但是,当我构建应用程序时,下划线消失了:

有谁知道为什么会发生这种情况以及如何在构建形式中进行下划线显示?

【问题讨论】:

  • 尝试按 alt 将下划线带回正在运行的应用程序中

标签: c# .net visual-studio-2010 toolstripmenu keyboard-shortcuts


【解决方案1】:

正如其他答案中提到的,这是默认行为。仅在按下 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());
}

找到here

正如我刚刚验证过的(在ken2k 在 cmets 中的建议之后),这很不幸地影响了整个系统。所以它需要一些调整:1)在启动时记住SPI_SETKEYBOARDCUES的当前值2)在退出时将设置重置为这个值,3) 创建域异常处理程序,以确保设置总是被重置。

不幸的是,即使最后一个参数为零,即使documentation 说:

如果您不想更新用户配置文件或广播 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);
}

this answer 中,您可以找到一个代码示例,说明如何仅为您的应用程序在本地实现这一点。

【讨论】:

  • 是的,您可以这样做,但这是个坏主意。应该允许用户做出这个选择。该应用程序不应该为他们完成。如果用户被拒绝这个选择,他们会非常沮丧。
  • @DavidHeffernan 这不是用户的选择,而是应用程序设计者的选择。我认为你想让你的应用程序看起来像你想要的那样是可以的。如果您想让用户参与确定应用程序的外观,那么这完全是另一个层面 - 实现主题等。
  • 整个其他级别?一点也不。易于访问中心中已经存在定制。显然应用程序设计者可以选择忽略系统设置,但在我看来这是一个错误。
  • @BartoszKP “让您的应用程序看起来像您想要的那样” ==> 是的,但这不仅仅是关于应用程序,这会将更改应用于整个系统。如果它采用窗口句柄作为参数就可以了,但是更改特定应用程序的系统参数是应用程序所期望的。
  • @ken2k AFAIK,正如我链接到的博客中所说,这只会改变您的应用程序的行为。
【解决方案2】:

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

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

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

【讨论】:

  • 据我所知,这并不总是“Windows 的默认行为”。事实上,从不知道这是系统设置。很高兴我现在可以启用它。
  • 另外请注意,这些菜单中的很多都是由鼠标右键触发的,而不是由alt触发的,并且在右键单击后按alt只是关闭 那个菜单,这意味着你永远看不到这些菜单的快捷方式。这总是让我在互联网浏览器中感到恼火。
  • @Nyerguds 我认为早期版本的 Windows 总是显示加速键下划线,但在 Windows 2000 中它们成为可选
  • 据我记忆,XP 确实显示它们在右键菜单中。此外,在 Win10 上,当您按下键盘上的上下文菜单按钮时,它们似乎甚至不会显示,而使用该键通常意味着您只想在键盘上导航菜单。
【解决方案3】:

其他答案已经解释了您观察到的行为。我不会重复这些。

为了完整起见,并扩展BartoszKP's answer,有一种方法可以以应用程序本地的方式控制加速键的隐藏。具体来说就是WM_UPDATEUISTATE 消息。通过UIS_CLEARUISF_HIDEACCEL。我对这个问题的回答显示了如何做到这一点:Show Hotkeys at All Times

【讨论】:

  • 正如预期的那样,这需要目标窗口的句柄作为参数。感谢您提供详细信息。
【解决方案4】:

从 Windows Vista 开始(我认为),默认情况下不显示快捷方式提示。您需要按 Alt 来显示它们。在可访问性设置中有一个全局系统设置可以更改该行为。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      相关资源
      最近更新 更多