WPF 全局快捷键

示例:按ESC快捷键
#region 注册全局快捷键
//引入Winows API
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

private const int HOTKEY_ID = 9527;

//Modifiers:
private const uint MOD_NONE = 0x0000; //(none)
private const uint MOD_ALT = 0x0001; //ALT
private const uint MOD_CONTROL = 0x0002; //CTRL
private const uint MOD_SHIFT = 0x0004; //SHIFT
private const uint MOD_WIN = 0x0008; //WINDOWS
//CAPS LOCK:
private const uint VK_CAPITAL = 0x14;
private IntPtr _windowHandle;
private HwndSource _source;
protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    _windowHandle = new WindowInteropHelper(this).Handle;
    _source = HwndSource.FromHwnd(_windowHandle);
    _source.AddHook(HwndHook);
    //RegisterHotKey(_windowHandle, HOTKEY_ID, 第一个键, 第二个键);
    RegisterHotKey(_windowHandle, HOTKEY_ID, 0, 0x1B);

}

private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    const int WM_HOTKEY = 0x0312;//热键消息
    switch (msg)
    {
        case WM_HOTKEY:
            switch (wParam.ToInt32())
            {
                case HOTKEY_ID:
                    int vkey = (((int)lParam >> 16) & 0xFFFF);
                    if (vkey == 0x1B)
                    {
                        this.Topmost = false;
                        this.WindowStyle = System.Windows.WindowStyle.None;
                        this.WindowState = System.Windows.WindowState.Normal;
                    }
                    handled = true;
                    break;
            }
            break;
    }
    return IntPtr.Zero;
}

protected override void OnClosed(EventArgs e)
{
    _source.RemoveHook(HwndHook);
    UnregisterHotKey(_windowHandle, HOTKEY_ID);
    base.OnClosed(e);
}
#endregion

 

posted @ 2024-05-23 02:02  microsoft-zhcn  阅读(3)  评论(0编辑  收藏  举报