始终显示热键

Posted

技术标签:

【中文标题】始终显示热键【英文标题】:Show Hotkeys at All Times 【发布时间】:2012-12-12 19:19:51 【问题描述】:

是否可以使下划线热键在我的控件上始终可见,而无需使用 Visual Studio - C# 在 Windows 窗体中按 Alt 键?

我只有特定的时间需要表单的控件始终在字符下用“_”加下划线。所以最好有代码来做。

我可以将 Windows 设置为始终显示快捷方式和热键的下划线,但我只需要它在特定时间发生。

【问题讨论】:

【参考方案1】:

假设您使用的是 WinForms,您应该能够依赖底层的 Win32 机制。这就是WM_UPDATEUISTATE 消息。文档说:

应用程序发送 WM_UPDATEUISTATE 消息以更改指定窗口及其所有子窗口的 UI 状态。

这样您就可以将消息发送到***窗口的句柄。 wParam的低位字需要通过UIS_CLEARwParam的高位字需要通过UISF_HIDEACCEL

这是一些相当粗略的示例代码。请记住,我的 C# 专业知识非常有限。

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);

【讨论】:

您只需要对 SendMessage 进行一次调用即可。你熟悉 pinvoke 和 SendMessage。

以上是关于始终显示热键的主要内容,如果未能解决你的问题,请参考以下文章

PrimeFaces热键始终使用任何键

XCode 显示函数参数热键

Thinkpad e425热键在屏幕上没有显示怎么办?

Netbeans热键关闭突出显示的搜索文本?

thinkpad 睡眠唤醒后热键功能正常,但屏幕无法显示状态/进度条/图标

WPF:按 ALT 键时,按钮上的热键不显示下划线