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);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…