Как установить HotKey для всей системы в C#

В AutoIt v3 есть функция HotKeySet. Он устанавливает горячую клавишу, которая вызывает пользовательскую функцию при нажатии. Это системная горячая клавиша, означающая, что клавиша не может использоваться ни для чего другого, когда горячая клавиша установлена.

В принципе, я хотел бы поймать Esc или любой другой ключ, как $, `и т. д., и когда пользователь нажимает его где угодно, даже за пределами приложения, он должен сообщить мне об этом.

Например, я хотел бы сделать HotKeySet({ESC}) внутри цикла, и когда это будет сделано, программа будет ожидать нажатия этой клавиши раньше.

public static void work() {
    while (true) {
        string task = null;
        lock (locker)
            if (tasks.Count > 0) {
                task = tasks.Dequeue();
                if (task == null) {
                    return;
                }
            }
        if (task != null) {
            //MessageBox.Show("Performing task: " + task);
            Program.mainAnnounceWindow.setLogTextBox(task);
            Program.mainAnnounceWindow.setLogTrayTip(task);
            Program.windowStateChange("Show");

            // Set the hotkey here
            SetHotkey(`);

            //Wait for hotkey to press when it's pressed... Execute some stuff
            Thread.Sleep(5000); // Simulate work...
            Program.windowStateChange("Hide");
        }
        else {
            wh.WaitOne(); // No more tasks - wait for a signal
        }
    }
}

2 ответа

Решение

Вам нужно взглянуть на RegisterHotKey в user32.dll. Там хороший пример на pinvoke.net, RegisterHotKey (user32).

Я думаю, что вам нужно настроить системный хук...

Вот пример: http://www.axino.net/tutorial/2009/02/keylogger-in-c-introduction

Другие вопросы по тегам