日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

键盘钩子

發布時間:2023/11/30 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 键盘钩子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#鍵盤鉤子//*************************鍵盤鉤子********************** //定義變量 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); static int hKeyboardHook = 0; HookProc KeyboardHookProcedure; /************************* * 聲明API函數 * ***********************/ // 安裝鉤子 (using System.Runtime.InteropServices;) [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId); // 卸載鉤子 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); // 繼續下一個鉤子 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); // 取得當前線程編號(線程鉤子需要用到) [DllImport("kernel32.dll")] static extern int GetCurrentThreadId(); //鉤子子程:就是鉤子所要做的事情 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { if (nCode >= 0) { /**************** //線程鍵盤鉤子判斷是否按下鍵 Keys keyData = (Keys)wParam; if(lParam.ToInt32() > 0) { // 鍵盤按下 } if(lParam.ToInt32() < 0) { // 鍵盤抬起 } ****************/ /**************** //全局鍵盤鉤子判斷是否按下鍵 wParam = = 0x100 // 鍵盤按下 wParam = = 0x101 // 鍵盤抬起 ****************/ KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//鍵盤 // 在這里添加你想要做是事情(比如把鍵盤nCode記錄下來,搞個郵件發送程序發到自己的郵箱去) return 0;//如果返回1,則結束消息,這個消息到此為止,不再傳遞。如果返回0或調用CallNextHookEx函數則消息出了這個鉤子繼續往下傳遞,也就是傳給消息真正的接受者 } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } //鍵盤結構 public struct KeyMSG { public int vkCode; //鍵值 public int scanCode; public int flags; public int time; public int dwExtraInfo; } // 安裝鉤子 public void HookStart() { if(hKeyboardHook == 0) { // 創建HookProc實例 KeyboardHookProcedure = new HookProc(KeyboardHookProc); // 設置線程鉤子 hKeyboardHook = SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); //************************************ //鍵盤線程鉤子 //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()為要監視的線程ID,你完全可以自己寫個方法獲取QQ的線程哦 //鍵盤全局鉤子,需要引用空間(using System.Reflection;) //SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); // //關于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函數將鉤子加入到鉤子鏈表中,說明一下四個參數: //idHook 鉤子類型,即確定鉤子監聽何種消息,上面的代碼中設為2,即監聽鍵盤消息并且是線程鉤子,如果是全局鉤子監聽鍵盤消息應設為13, //線程鉤子監聽鼠標消息設為7,全局鉤子監聽鼠標消息設為14。 // //lpfn 鉤子子程的地址指針。如果dwThreadId參數為0 或是一個由別的進程創建的線程的標識,lpfn必須指向DLL中的鉤子子程。 除此以外,lpfn可 //以指向當前進程的一段鉤子子程代碼。鉤子函數的入口地址,當鉤子鉤到任何消息后便調用這個函數。 // //hInstance應用程序實例的句柄。標識包含lpfn所指的子程的DLL。如果threadId 標識當前進程創建的一個線程,而且子程代碼位于當前 //進程,hInstance必須為NULL。可以很簡單的設定其為本應用程序的實例句柄。 // //threadedId 與安裝的鉤子子程相關聯的線程的標識符。如果為0,鉤子子程與所有的線程關聯,即為全局鉤子。 //************************************ // 如果設置鉤子失敗 if(hKeyboardHook == 0 ) { HookStop(); throw new Exception("SetWindowsHookEx failed."); } } } // 卸載鉤子 public void HookStop() { bool retKeyboard = true; if(hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } if (!( retKeyboard)) throw new Exception("UnhookWindowsHookEx failed."); } //*****************************

總結

以上是生活随笔為你收集整理的键盘钩子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。