Использование глобальных горячих клавиш: получить фактически нажатую клавишу - PullRequest
0 голосов
/ 18 января 2019

В моем form я регистрирую разные горячие клавиши. Позже, во время исполнения, я хотел бы знать, какая из горячих клавиш была нажата. Где я могу получить эту информацию?

Регистрация во время инициализации:

public Form1()
{
   this.KeyPreview = true;
   ghk = new KeyHandler(Keys.F1, this);
   ghk.Register();
   ghk = new KeyHandler(Keys.F2, this);
   ghk.Register();
   InitializeComponent();
}

Использование этого класса KeyHandler:

public class KeyHandler
{
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

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

    private int key;
    private IntPtr hWnd;
    private int id;

    public KeyHandler(Keys key, Form form)
    {
        this.key = (int)key;
        this.hWnd = form.Handle;
        id = this.GetHashCode();
    }

    public override int GetHashCode()
    {
        return key ^ hWnd.ToInt32();
    }

    public bool Register()
    {
        return RegisterHotKey(hWnd, id, 0, key);
    }

    public bool Unregister()
    {
        return UnregisterHotKey(hWnd, id);
    }
}

Метод, который срабатывает:

protected override void WndProc(ref Message m)
{
   if (m.Msg == Constants.WmHotkeyMsgId)
   HandleHotkey(m);
   base.WndProc(ref m);
}

Здесь я хочу различить две горячие клавиши:

private void HandleHotkey(Message m)
{
   if(key == F1)
      DoSomething
   if(key == F2)
      DoSomethingElse
}

1 Ответ

0 голосов
/ 18 января 2019

Вы должны быть в состоянии узнать фактический ключ, используя идентификатор. Когда вы регистрируете горячую клавишу, вы используете идентификатор, ключ и модификатор. Когда горячая клавиша нажата, Windows выдает идентификатор горячей клавиши в обратном вызове, а не клавишу и модификаторы.

RegisterHotKey(Handle, id: 1, ModifierKeys.Control, Keys.A);
RegisterHotKey(Handle, id: 2, ModifierKeys.Control | ModifierKeys.Alt, Keys.B);
const int WmHotKey = 786;
if (msg.message != WmHotKey)
    return;

var id = (int)msg.wParam;
if (id == 1) // Ctrl + A
{
}
else if (id == 2) // Ctrl + Alt + B
{
}

Вот сообщение в блоге, которое я написал с кодом для регистрации горячей клавиши для приложения WPF: https://www.meziantou.net/2012/06/28/hotkey-global-shortcuts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...