0

私は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)
    {
    }
4

1 に答える 1

2
    while(true) {}

これはホールド アンド キャッチ ファイア ステートメントです。スレッドは 100% コアを消費し、フック コールバックを実行できません。キーを押すと、マシンが 5 秒間停止することに気付くでしょう。オペレーティング システムは、コールバックを呼び出す機会を待っています。しかし、それは永遠に待つことはなく、不意にフックを破壊するので、マシンの制御を取り戻します. また、イベント ハンドラーをデバッグしようとしたときに発生する事故の種類。

Windows には、フック コールバックを安全に呼び出す機会が必要です。それには、コードを実行せずに、プログラムを「アイドル状態」にする必要があります。これを専門用語で「メッセージ ループをポンピングする」といいます。プログラムは、何か興味深いことが起こったというオペレーティング システムからの通知を待つ必要があります。

非常に簡単な方法は、Winforms プロジェクト テンプレートをそのまま使用することです。ウィンドウも表示されます。プロジェクトの Main() メソッドが、while() ループの代わりに必要な呼び出しを行う方法に注意してください。に電話する必要がありますApplication.Run()

ウィンドウの表示を回避するコードについては、この投稿を確認してください。

于 2015-06-06T08:46:20.810 に答える