Для MenuStrip
вам необходимо создать пользовательский рендерер, чтобы всегда отображать мнемонику независимо от того, нажимаете или не нажимаете клавишу Alt .Для этого необходимо извлечь из ToolStripProfessionalRenderer
и переопределить его OnRenderItemText
, удалив флаги NoPrefix
и HidePrefix
из e.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);
}
}