Ключевой слушатель не стреляет (MouseKeyHook)

Я начинаю на C#, много пишу на Java, но у меня возникли некоторые проблемы. Я пытаюсь научиться использовать MouseKeyHook для разрабатываемого приложения. Я не могу заставить настоящего слушателя запустить событие. Вот мой код слушателя:

using System;
using System.Windows.Forms;
using Gma.System.MouseKeyHook;

namespace ChromaHeatmap
{
    class keyListener
    {
        private IKeyboardMouseEvents m_GlobalHook;

        public void Subscribe()
        {
            // Note: for the application hook, use the Hook.AppEvents() instead
            m_GlobalHook = Hook.GlobalEvents();
            m_GlobalHook.KeyPress += GlobalHookKeyPress;
        }

        private void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
        {
            Console.WriteLine("blah");
        }

        public void Unsubscribe()
        {
            m_GlobalHook.KeyPress -= GlobalHookKeyPress;

            //It is recommened to dispose it
            m_GlobalHook.Dispose();
        }
    }
}

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

    //Listen for key presses
    keyListener heyListen = new keyListener();
    heyListen.Subscribe();

    while(true)
    {
    }

1 ответ

    while(true) {}

Это оператор hold-and-catch-fire, поток сожжет 100% ядро ​​и не сможет выполнить обратный вызов ловушки. Вы заметите, что машина глохнет в течение 5 секунд, когда вы нажимаете клавишу, операционная система ждет возможности вызвать обратный вызов. Но он не будет ждать вечно и бесцеремонно разрушит крюк, чтобы вы восстановили контроль над машиной. Также вид неудачи, которая произойдет, когда вы попытаетесь отладить ваш обработчик событий.

Windows нуждается в возможности безопасно вызвать перехват вызова. Это требует, чтобы ваша программа была "бездействующей", а не выполняла какой-либо код. Технический термин для этого - "прокачка цикла сообщений", ваша программа должна ждать уведомления от операционной системы о том, что произошло что-то интересное.

Очень простой способ - использовать шаблон проекта Winforms как есть, вы также получите окно. Обратите внимание, как метод Main() в проекте выполняет необходимый вызов вместо цикла while(). Вы должны позвонить Application.Run(),

Проверьте этот пост на наличие кода, который не отображает окно.

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