簡體   English   中英

關鍵偵聽器不觸發(MouseKeyHook)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM