[英]Key listener not firing (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)
{
}
while(true) {}
這是一個hold-and-catch-fire語句,該線程將消耗100%的內核,並且無法執行鈎子回調。 您會注意到,當您按下一個鍵時,計算機將死機5秒鍾,操作系統正在等待調用回調的機會。 但是它不會永遠等待,並且毫不客氣地破壞了鈎子,因此您可以重新控制計算機。 當您嘗試調試事件處理程序時,也會發生這種情況。
Windows需要機會安全地調用掛鈎回調。 這要求您的程序“空閑”,不執行任何代碼。 這個技術術語是“泵送消息循環”,您的程序必須等待操作系統通知發生了有趣的事情。
一種非常簡單的方法是按原樣使用Winforms項目模板,您還將獲得一個窗口。 注意項目中的Main()方法如何進行所需的調用,而不是while()循環。 您必須調用Application.Run()
。
在這篇文章中查看避免顯示窗口的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.