c# - 有没有办法不按ALT就强制显示助记键?

标签 c# .net winforms mnemonics

我正在开发 WinForms 应用程序,我想使用 Mnemonics 键。似乎由于 Windows 参数,您可以选择在使用应用程序时仅在按下 ALT 后显示它们(此选项与默认选项类似)。多亏了这个question,我才知道这个选项(顺便说一句,相关但不重复)。

我更改了这个选项,助记符下划线在开头正确显示。但我想避免用户必须打开此选项或必须按 ALT 才能看到带下划线的键。

所以我的问题是:应用内是否有强制助记键下划线而不更改设置或按 ALT 键的情况?

最佳答案

对于 MenuStrip,您需要创建一个自定义渲染器以始终显示助记符,无论是否按下 Alt 键。为此,从 ToolStripProfessionalRenderer 派生并覆盖其 OnRenderItemText,从 e 中删除 NoPrefixHidePrefix 标志。文本格式。然后为 ToolStripManager.Renderer 注册渲染器。

对于其他显示助记符的控件,可以覆盖窗体的WndProc方法,处理WM_UPDATEUISTATE消息并将 WParam 设置为 UISF_HIDEACCEL 作为高位词和 UIS_CLEAR 作为低位词的组合。这样所有的控件都会显示助记下划线。

示例

只需将以下代码复制并粘贴到您的表单中,然后运行您的应用程序。该表单将显示所有助记符的下划线,而无需按 Alt:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
const int WM_UPDATEUISTATE = 0x0128;
const int UISF_HIDEACCEL = 0x2;
const int UIS_CLEAR = 0x2;
protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    ToolStripManager.Renderer = new MyRenderer();
}
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_UPDATEUISTATE)
        m.WParam = (IntPtr)((UISF_HIDEACCEL & 0x0000FFFF) | (UIS_CLEAR << 16));
    base.WndProc(ref m);
}
public class MyRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
    {
        e.TextFormat &= ~TextFormatFlags.NoPrefix;
        e.TextFormat &= ~TextFormatFlags.HidePrefix;
        base.OnRenderItemText(e);
    }
}

enter image description here

关于c# - 有没有办法不按ALT就强制显示助记键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705423/

相关文章:

c# - 删除dataGridView的最后一个空行

c# - 错误 CS0133 : Assigning the result of a function to a const in C#. 网络

c# - 如何将MEF导入导出信息持久化到磁盘

c# - 同步 TableLayoutPanel

c# - 将 XML 字符串注入(inject) XmlWriter 时的 XML 缩进

c# - 传入和传出后台 worker 的数据会发生什么变化?

c# - 如何在 C# 中检查损坏的 TIFF 图像?

javascript - 如何使用 javascript 回发到不同的表单

c# - 遍历数组 - 获取所有其他项目?

c# - 将当前表单移动到屏幕左侧