2017-03-21 49 views
1

幾天前我開始使用MouseKeyHook庫來攔截我們正在構建的應用程序(應用程序使用數字鍵盤作爲輸入來通過Akka發送特定消息等)的鍵盤按鈕。使用MouseKeyHook時KeyPress事件不會觸發

我已經設法使用控制檯應用程序很快地工作,並在那裏註冊所有內容,但是一旦我將實現移到特定服務中,它就停止工作(事件未被觸發)。

下面的代碼例如:

public class KeypadService : IKeypad 
{ 
    private readonly IKeyboardEvents _keyboardEvents; 

    public KeypadService() 
    { 
     _keyboardEvents = Hook.GlobalEvents(); 
     _keyboardEvents.KeyPress += GlobalHookKeyPress; 
    } 

    public void Enable(Action<string> codeEntered) 
    { 

    } 

    public void Disable() 
    { 
     _keyboardEvents.KeyPress -= GlobalHookKeyPress; 
    } 

    private static void GlobalHookKeyPress(object sender, KeyPressEventArgs e) 
    { 
     // Do something 
    } 
} 

KeypadService由Autofac在應用程序開始時創建(和啓動應用程序是一個控制檯應用程序)。

builder.RegisterType<KeypadService>().As<IKeypad>().SingleInstance(); 

正在命中構造函數,並且所有內容都在構造函數中執行。

任何線索爲什麼它可能不會被解僱?任何幫助表示讚賞!

+0

你試圖從窗口服務掛鉤鍵盤?是對的嗎? –

回答

0

我的假設是,你是你試圖鉤住windows服務的鍵盤。如果是這樣就有問題。

簡要說明: Windows鉤子需要有一個所謂的「交互式會話」才能正常工作。每當用戶登錄時都會創建一個交互式會話。由於可以將多個用戶登錄到Windows計算機,因此有時會有多個交互式會話,有時甚至沒有。從服務互動環節獨立運作,他們甚至在沒有人登錄運行

看到這個線程詳細的解釋:Global Keyboard Hook from windows service 窗口服務

+0

不是,但我明白你的意思。我實際上是通過一個控制檯應用程序(作爲後臺運行的Windows應用程序)來執行此操作,它執行常見的啓動任務,如註冊依賴項,啓動我的演員系統等。我的第一種方法是實際讓Autofac創建一個KeypadService的實例,但是它沒有工作,然後我通過在控制檯應用程序內手動創建一個實例並僅僅將該實例傳遞給依賴解析器,以便它可以完成它自己的事情,但那不是我想繼續做下去。 –