有没有办法在不按ALT的情况下强制显示助记键?

时间:2019-02-15 08:42:19

标签: c# .net winforms mnemonics

我正在使用WinForms应用程序,我想使用助记键。似乎由于Windows参数的缘故,您可以选择仅在按ALT后使用该应用程序时才显示它们(此选项作为默认值类似)。感谢这个question(虽然有关,但不是重复的),我知道了这个选项。

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

所以我的问题是:应用程序中是否存在无需更改设置或按ALT即可强制助记键下划线的问题?

1 个答案:

答案 0 :(得分:3)

对于MenuStrip,您需要创建一个自定义渲染器以始终显示助记符,而不管是否按 Alt 键。为此,从ToolStripProfessionalRenderer派生并覆盖其OnRenderItemText,从NoPrefix中删除HidePrefixe.TextFormat标志。然后为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