2012-10-25 107 views
4

目前,我正在製作攔截來自特定鍵盤的擊鍵(使用其HID過濾)的程序。因此,知道哪些按鍵已經由一個特定設備發送的,我用了RawInput TECHNIC,這個偉大的教程啓發:來自rawinput的低級鍵盤掛鉤和擊鍵

http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

現在,它的偉大工程:我可以得到一個按鍵,並知道哪些鍵盤有生成它。

我的項目的困難部分是攔截和阻止來自此特定鍵盤的擊鍵,以避免這些擊鍵到達聚焦應用程序(焦點意味着操作系統帶來的前臺窗口)。

所以自然的解決方案是一個低級別的全局鉤子,在所有當前有窗口句柄的線程上。

我使用,改編自該頁面的代碼做到這一點:

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

我在Visual Studio中創建一個新的項目,以避免把亂七八糟的東西我的工作。經過一番研究,我能夠阻止的所有應用程序按鍵,在回調函數返回值(-1):

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
//Check if we have a key to pass 

if (
    nCode >= 0 && ( 
    (wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP)) 
    ) 
{ 
    int vkCode = Marshal.ReadInt32(lParam); 
    if ((Keys)vkCode == Form1.KeysToIgnore) 
    { 
     return (IntPtr)(-1); 
    } 
} 
return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

把所有在一起(鉤子程序,以及按鍵檢測),我在最後的項目創建兩個線程:

第一:使用RawInput識別和每次擊鍵附着到設備

第二:用於鉤所有窗戶和塊某些碼擊鍵

線程1被設計爲發送按鍵以阻塞線程2,該線程讀取從特定鍵盤發送到所有窗口應用程序和垃圾鍵擊的所有消息。我確定這兩個線程是同步的。

問題是鉤子似乎在執行Rawinput之前執行,所以我無法識別發送按鍵的鍵盤。我不知道如何做到這一點,也許改變鉤子的類型(避免使用低級別的鍵盤鉤子,但使用用戶空間級別的鍵盤鉤子)。

或者,也許有人知道一個聰明的方式來做我想要的?

我知道這個請求真的很複雜,請不要猶豫,詢問更多細節。

+0

您是否考慮過使用攔截庫? http://oblita.com/Interception.html –

+0

看起來非常非常好。我會這樣挖,謝謝! – Louisbob

回答

2

我試圖做同樣認爲製作條形碼掃描儀(使用HID鍵盤仿真)通過軟件爲紅色,不能用作輸入。

我發現了這一點,但我不熟悉如何使用它,因爲它是不完整的代碼和我是新的C#,希望我可以幫你幫我:

Intercept keyboard

1

如果您在.net應用程序中實現此功能,我個人推薦使用EasyHook,這可以讓您做更多的事情,而不僅僅是攔截按鍵,而且它非常易於使用。