windows mobile 鍵盤鉤子 屏蔽按鍵
封裝好的類,直接添加到工程中就可以使用。
注意:? 這種方式可能會(huì)出一些意想不到的問(wèn)題,比如在windows mobile平臺(tái),直接在C#程序中使用coredll.dll的鉤子,可能導(dǎo)致cursor顯示不正常,C#程序中啟動(dòng)新的其他進(jìn)程,返回時(shí)點(diǎn)按鍵可能導(dǎo)致程序卡死等其他問(wèn)題,雖然方便,但不建議如此使用鉤子。建議的方式是用C++編譯一個(gè)鉤子程序,在C#程序中調(diào)用,這樣,鉤子和C#程序不在一個(gè)進(jìn)程中,安全性更高一些。
/*這個(gè)類是用來(lái)屏蔽相關(guān)按鍵的,你可以new一個(gè)這個(gè)類的實(shí)例,然后調(diào)用相關(guān)的public方法就可以了,在C#程序中,你要在程序開始的位置調(diào)用,也就是Main函數(shù)中的窗體創(chuàng)建語(yǔ)句前調(diào)用開始鉤子函數(shù)。在Main函數(shù)結(jié)束的位置再調(diào)用鉤子關(guān)閉函數(shù)。將你想屏蔽的按鍵的鍵值添加到對(duì)應(yīng)的位置,注釋里面有解釋,請(qǐng)查看。*/ public?class?KeyBoardHookClass ????{ ????????public?delegate?int?HookProc(int?nCode,?int?wParam,ref?KeyMSG?lParam);?????????//聲明代理,用于回調(diào)函數(shù) ????????private?static?int?hKeyboardHook?=?0; ????????private?HookProc?KeyboardHookProcedure; ????????//win32下使用user32.dll??windows?mobile?6.5下使用coredll.dll ????????//設(shè)置鉤子 ????????[DllImport("coredll.dll",EntryPoint?=?"SetWindowsHookEx")] ????????public?static?extern?int?SetWindowsHookEx(HookType?idHook,?HookProc?lpfn,?IntPtr?hInstance,?int?threadId); ????????//抽調(diào)鉤子 ????????[DllImport("coredll.dll",?EntryPoint?=?"UnhookWindowsHookEx")] ????????public?static?extern?bool?UnhookWindowsHookEx(int?idHook); //獲得模塊的句柄 ????????[DllImport("coredll.dll",?EntryPoint?=?"GetModuleHandle")] ????????public?static?extern?IntPtr?GetModuleHandle(string?name); //鉤子消息循環(huán) ????????[DllImport("coredll.dll",?EntryPoint?=?"CallNextHookEx")] ????????public?static?extern?int?CallNextHookEx(int?idHook,?int?nCode,?int?wParam,?ref?KeyMSG?lParam); ????????//鉤子類型,可以根據(jù)情況自定義類型 ????????public?enum?HookType ????????{ ????????????WH_KEYBOARD?=?2, ????????????WH_KEYBOARD_LL?=?20 //鍵盤鉤子 ????????} ????????//鍵值枚舉,可以把你想屏蔽的按鍵定義在這個(gè)枚舉里面 ????????public?enum?KeyValueMap?:?int ????????{ VK_ESCAPE=0x1B,?? //ESC VK_RETURN=0x0D, ? //RETURN,回車 VK_APP5=0xC5,???? //藍(lán)色FN VK_APP2=0xC2?,??? //黃色FN VK_APP1=0xC1, ? //WIN,菜單鍵 VK_TEND?=?0x73,?? //End,掛斷鍵 VK_TTALK?=?0x72,? //Talk,撥號(hào)鍵 VK_TVOLUMEUP=0x75, //音量+ VK_TVOLUMEDOWN=0x76,//音量- VK_BACK=0x08, ? //BKSP VK_SHIFT=0x10, //SHIFT VK_TAB=0x09, //TAB VK_TSTAR=0x77, //*,星號(hào) VK_TPOUND=0x78, //#,井號(hào) ????????????WM_KEYDOWN?=?0x0100, ????????????WM_KEYUP?=?0x0101, ????????????WM_SYSKEYDOWN?=?0x0104, ????????????WM_SYSKEYUP?=?0x0105 ????????} ????????//鍵盤結(jié)構(gòu)? ????????public?struct?KeyMSG ????????{ ????????????public?int?vkCode;?//鍵值? ????????????public?int?scanCode; ????????????public?int?flags; ????????????public?int?time; ????????????public?int?dwExtraInfo; ????????} //打開鉤子 ????????public?void?StartHook() ????????{ ????????????try ????????????{ ????????????????KeyboardHookProcedure?=?new?HookProc(KeyboardHookProc); ????????????????hKeyboardHook?=?SetWindowsHookEx(HookType.WH_KEYBOARD_LL,?KeyboardHookProcedure,?IntPtr.Zero,?0); ????????????} ????????????catch?(Exception?ex) ????????????{ ????????????????StopHook(); ????????????????throw?new?Exception(ex.ToString()?+?"安裝鉤子失敗."); ????????????} ????????} //關(guān)閉鉤子 ????????public?void?StopHook() ????????{ ????????????try ????????????{ ????????????????UnhookWindowsHookEx(hKeyboardHook); ????????????} ????????????catch?(Exception?ex) ????????????{ ????????????????throw?new?Exception(ex.ToString()?+?"卸下鉤子失敗."); ????????????} ????????} ????????//鉤子回調(diào)函數(shù) ????????private?int?KeyboardHookProc(int?nCode,?int?wParam,?ref?KeyMSG?lParam) ????????{ ????????????if?(nCode?>=?0) ????????????{ ????????????????//Keys?keyData?=?(Keys)wParam;????????????????????????????//wParam用于判斷是按鍵按下還是彈起 ????????????????KeyMSG?m?=?(KeyMSG)lParam; ????????????????if?(wParam?==?(int)KeyValueMap.WM_KEYDOWN?||?wParam?==?(int)KeyValueMap.WM_KEYUP?||?wParam?==?(int)KeyValueMap.WM_SYSKEYDOWN?||?wParam?==?(int)KeyValueMap.WM_SYSKEYUP)?????????????????????????????//key?down ????????????????{ ????????????????????//處理相關(guān)代碼,需要屏蔽的按鍵在此case ????????????????????switch?(m.vkCode) ????????????????????{ ????????????????????????case?(int)KeyValueMap.VK_TEND:???????????????????//屏蔽掉掛斷鍵 ????????????????????????case?(int)KeyValueMap.VK_TTALK: ????????????????????????????{ ????????????????????????????????return?1; ????????????????????????????} ????????????????????} ????????????????} ????????????} ????????????return?CallNextHookEx(hKeyboardHook,?nCode,?wParam,ref?lParam); ????????} ????}