Ключевой слушатель не стреляет (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()
,
Проверьте этот пост на наличие кода, который не отображает окно.