Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show Hotkeys at All Times

Is is possible to make the underlining hotkey always visible on my controls without having to press the Alt key in a Windows form with Visual Studio - C#?

I only have a certain time when I need the controls of the form to be always underlined with the "_" under a character. So it would be good to have just the code to do it.

I could have the setting for Windows to always show underlining of shortcuts and hotkeys, but I only need it to happen a certain time.

like image 726
Bubbled86 Avatar asked Jan 15 '23 16:01

Bubbled86


1 Answers

Assuming you are using WinForms, you should be able to rely on the underlying Win32 mechanism. And that is the WM_UPDATEUISTATE message. The documentation says:

An application sends the WM_UPDATEUISTATE message to change the UI state for the specified window and all its child windows.

So you can send the message to the handle of the top-level window. You need to pass UIS_CLEAR for the low-order word of wParam and UISF_HIDEACCEL for the high-order word of wParam.

Here is some rather crude sample code. Bear in mind that my C# expertise is very limited.

public partial class Form1 : Form
{
    private const uint WM_UPDATEUISTATE = 0x0128;
    private const uint WM_QUERYUISTATE = 0x0129;
    private const uint UIS_CLEAR = 2;
    private const uint UISF_HIDEACCEL = 0x2;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_HandleCreated(object sender, PaintEventArgs e)
    {
        ClearHideAccel();
    }

    private void ClearHideAccel()
    {
        UIntPtr wParam = (UIntPtr)((UISF_HIDEACCEL << 16) | UIS_CLEAR);
        NativeMethods.SendMessage(this.Handle, WM_UPDATEUISTATE, wParam, IntPtr.Zero);
    }
}

internal class NativeMethods
{
    [DllImport("User32", SetLastError = true)]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, IntPtr lParam);
}
like image 147
David Heffernan Avatar answered Jan 18 '23 22:01

David Heffernan