C#全局鼠標鍵盤Hook (備查)

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace DCIEngine.FrameWork.Snap
{
??? ///?? <summary>
??? ///?? 這個類可以讓你得到一個在運行中程序的所有鍵盤或鼠標事件
??? ///?? 并且引發一個帶KeyEventArgs參數的.NET事件以便你很容易使用這些信息
??? ///?? </summary>

??? public class KeyBordHook
??? {
??????? private const int WM_KEYDOWN = 0x100;
??????? private const int WM_KEYUP = 0x101;
??????? private const int WM_SYSKEYDOWN = 0x104;
??????? private const int WM_SYSKEYUP = 0x105;

??????? //全局的事件
??????? public event KeyEventHandler OnKeyDownEvent;
??????? public event KeyEventHandler OnKeyUpEvent;
??????? public event KeyPressEventHandler OnKeyPressEvent;
??????? static int hKeyboardHook = 0;?? //鍵盤鉤子句柄
??????? //鼠標常量
??????? public const int WH_KEYBOARD_LL = 13;?? //keyboard?? hook?? constant??
??????? HookProc KeyboardHookProcedure;?? //聲明鍵盤鉤子事件類型.
??????? //聲明鍵盤鉤子的封送結構類型
??????? [StructLayout(LayoutKind.Sequential)]
??????? public class KeyboardHookStruct
??????? {
??????????? public int vkCode;?? //表示一個在1到254間的虛似鍵盤碼
??????????? public int scanCode;?? //表示硬件掃描碼
??????????? public int flags;
??????????? public int time;
??????????? public int dwExtraInfo;
??????? }
??????? //裝置鉤子的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
??????? //卸下鉤子的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern bool UnhookWindowsHookEx(int idHook);

??????? //下一個鉤掛的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
??????? [DllImport("user32 ")]
??????? public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);
??????? [DllImport("user32 ")]
??????? public static extern int GetKeyboardState(byte[] pbKeyState);
??????? public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
??????? ///?? <summary>
??????? ///?? 墨認的構造函數構造當前類的實例并自動的運行起來.
??????? ///?? </summary>
??????? public KeyBordHook()
??????? {
??????????? Start();
??????? }
??????? //析構函數.
??????? ~KeyBordHook()
??????? {
??????????? Stop();
??????? }
??????? public void Start()
??????? {
??????????? //安裝鍵盤鉤子??
??????????? if (hKeyboardHook == 0)
??????????? {
??????????????? KeyboardHookProcedure = new HookProc(KeyboardHookProc);
??????????????? hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule), 0);
??????????????? if (hKeyboardHook == 0)
??????????????? {
??????????????????? Stop();
??????????????????? throw new Exception("SetWindowsHookEx?? ist?? failed. ");
??????????????? }
??????????? }
??????? }
??????? public void Stop()
??????? {
??????????? bool retKeyboard = true;

??????????? if (hKeyboardHook != 0)
??????????? {
??????????????? retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
??????????????? hKeyboardHook = 0;
??????????? }
??????????? //如果卸下鉤子失敗
??????????? if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx?? failed. ");
??????? }
??????? private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
??????? {
??????????? if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
??????????? {
??????????????? KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
??????????????? //引發OnKeyDownEvent
??????????????? if (OnKeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
??????????????? {
??????????????????? Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
??????????????????? KeyEventArgs e = new KeyEventArgs(keyData);
??????????????????? OnKeyDownEvent(this, e);
??????????????? }

??????????????? //引發OnKeyPressEvent
??????????????? if (OnKeyPressEvent != null && wParam == WM_KEYDOWN)
??????????????? {
??????????????????? byte[] keyState = new byte[256];
??????????????????? GetKeyboardState(keyState);
??????????????????? byte[] inBuffer = new byte[2];
??????????????????? if (ToAscii(MyKeyboardHookStruct.vkCode,
????????????????????? MyKeyboardHookStruct.scanCode,
????????????????????? keyState,
????????????????????? inBuffer,
????????????????????? MyKeyboardHookStruct.flags) == 1)
??????????????????? {
??????????????????????? KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
??????????????????????? OnKeyPressEvent(this, e);
??????????????????? }
??????????????? }

??????????????? //引發OnKeyUpEvent
??????????????? if (OnKeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
??????????????? {
??????????????????? Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
??????????????????? KeyEventArgs e = new KeyEventArgs(keyData);
??????????????????? OnKeyUpEvent(this, e);
??????????????? }
??????????? }
??????????? return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
??????? }
??? }


??? ///?? <summary>
??? ///?? 這個類可以讓你得到一個在運行中程序的所有鼠標事件
??? ///?? 并且引發一個帶MouseEventArgs參數的.NET鼠標事件以便你很容易使用這些信息
??? ///?? </summary>
??? public class MouseHook
??? {
??????? private const int WM_MOUSEMOVE = 0x200;
??????? private const int WM_LBUTTONDOWN = 0x201;
??????? private const int WM_RBUTTONDOWN = 0x204;
??????? private const int WM_MBUTTONDOWN = 0x207;
??????? private const int WM_LBUTTONUP = 0x202;
??????? private const int WM_RBUTTONUP = 0x205;
??????? private const int WM_MBUTTONUP = 0x208;
??????? private const int WM_LBUTTONDBLCLK = 0x203;
??????? private const int WM_RBUTTONDBLCLK = 0x206;
??????? private const int WM_MBUTTONDBLCLK = 0x209;
??????? //全局的事件
??????? public event MouseEventHandler OnMouseActivity;
??????? static int hMouseHook = 0;?? //鼠標鉤子句柄
??????? //鼠標常量
??????? public const int WH_MOUSE_LL = 14;?? //mouse?? hook?? constant
??????? HookProc MouseHookProcedure;?? //聲明鼠標鉤子事件類型.
??????? //聲明一個Point的封送類型
??????? [StructLayout(LayoutKind.Sequential)]
??????? public class POINT
??????? {
??????????? public int x;
??????????? public int y;
??????? }
??????? //聲明鼠標鉤子的封送結構類型
??????? [StructLayout(LayoutKind.Sequential)]
??????? public class MouseHookStruct
??????? {
??????????? public POINT pt;
??????????? public int hWnd;
??????????? public int wHitTestCode;
??????????? public int dwExtraInfo;
??????? }
??????? //裝置鉤子的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
??????? //卸下鉤子的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern bool UnhookWindowsHookEx(int idHook);

??????? //下一個鉤掛的函數
??????? [DllImport("user32.dll ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
??????? public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
??????? public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
??????? ///?? <summary>
??????? ///?? 墨認的構造函數構造當前類的實例.
??????? ///?? </summary>
??????? public MouseHook()
??????? {
??????????? //Start();
??????? }
??????? //析構函數.
??????? ~MouseHook()
??????? {
??????????? Stop();
??????? }
??????? public void Start()
??????? {
??????????? //安裝鼠標鉤子
??????????? if (hMouseHook == 0)
??????????? {
??????????????? //生成一個HookProc的實例.
??????????????? MouseHookProcedure = new HookProc(MouseHookProc);
??????????????? hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
??????????????? //如果裝置失敗停止鉤子
??????????????? if (hMouseHook == 0)
??????????????? {
??????????????????? Stop();
??????????????????? throw new Exception("SetWindowsHookEx failed. ");
??????????????? }
??????????? }
??????? }
??????? public void Stop()
??????? {
??????????? bool retMouse = true;
??????????? if (hMouseHook != 0)
??????????? {
??????????????? retMouse = UnhookWindowsHookEx(hMouseHook);
??????????????? hMouseHook = 0;
??????????? }

??????????? //如果卸下鉤子失敗
??????????? if (!(retMouse)) throw new Exception("UnhookWindowsHookEx?? failed. ");
??????? }
??????? private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)
??????? {
??????????? //如果正常運行并且用戶要監聽鼠標的消息
??????????? if ((nCode >= 0) && (OnMouseActivity != null))
??????????? {
??????????????? MouseButtons button = MouseButtons.None;
??????????????? int clickCount = 0;
??????????????? switch (wParam)
??????????????? {
??????????????????? case WM_LBUTTONDOWN:
??????????????????????? button = MouseButtons.Left;
??????????????????????? clickCount = 1;
??????????????????????? break;
??????????????????? case WM_LBUTTONUP:
??????????????????????? button = MouseButtons.Left;
??????????????????????? clickCount = 1;
??????????????????????? break;
??????????????????? case WM_LBUTTONDBLCLK:
??????????????????????? button = MouseButtons.Left;
??????????????????????? clickCount = 2;
??????????????????????? break;
??????????????????? case WM_RBUTTONDOWN:
??????????????????????? button = MouseButtons.Right;
??????????????????????? clickCount = 1;
??????????????????????? break;
??????????????????? case WM_RBUTTONUP:
??????????????????????? button = MouseButtons.Right;
??????????????????????? clickCount = 1;
??????????????????????? break;
??????????????????? case WM_RBUTTONDBLCLK:
??????????????????????? button = MouseButtons.Right;
??????????????????????? clickCount = 2;
??????????????????????? break;
??????????????? }
??????????????? //從回調函數中得到鼠標的信息
??????????????? MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
??????????????? MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0);
??????????????? OnMouseActivity(this, e);
??????????? }
??????????? return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
??????? }
??? }
}

轉載于:https://www.cnblogs.com/iEgrhn/archive/2008/02/17/1071392.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/380166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/380166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/380166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fcfs調度算法_FCFS:先來先服務調度算法

fcfs調度算法The FCFS, which stands for First Come First Serve Scheduling Algorithm, is a non-preemptive scheduling algorithm, which means that if a process once starts executing in the processor, then it cannot be preempted in between the processing. Thus,…

親和數

Problem Description 古希臘數學家畢達哥拉斯在自然數研究中發現&#xff0c;220的所有真約數(即不是自身的約數)之和為&#xff1a; 1245101120224455110&#xff1d;284。 1* 220220&#xff1b;2* 110220&#xff1b;4* 55220&#xff1b;5* 44220&#xff1b;10*20220;…

轉:JNI jstring與c++字符串類型轉換函數

jstring與c字符串類型轉換函數 jstring str2jstring(JNIEnv* env,const char* pat) {//定義java String類 strClassjclass strClass (env)->FindClass("Ljava/lang/String;");//獲取String(byte[],String)的構造器,用于將本地byte[]數組轉換為一個新Stringjmetho…

python字符串轉浮點數_如何在Python中檢查字符串是否為數字(浮點數)?

python字符串轉浮點數Using python it is very to interconvert the datatypes of a variable. A string can be easily converted to an integer or a float. However, asserting a string to be a float is a task by itself. Python provides an option to assert if a stri…

nhibernate學習之三級聯(Ternary Associations)篇

1) 學習目標通過進一步學習Nhibernate基礎知識&#xff0c;掌握用Nhiberate實現對級聯的支持&#xff0c;通過一個簡單的用戶角色權限系統來體驗nhibernate對級聯的強大支持。2&#xff09;開發環境和必要準備 開發環境為:windows 2003,Visual studio .Net 2005,Sql server 200…

【競賽題解】Codeforces Round #715 (Div. 2) C

C. The Sports Festival 題意&#xff1a;對于給定的整型數組aaa&#xff0c;每次選擇其中一個元素aia_iai?&#xff08;不能重復選擇同一元素&#xff09;&#xff0c;每次計算已選擇的元素的極差&#xff08;最大元素減最小元素的差&#xff09;&#xff0c;輸出最后極差和…

C和匯編---sizeof運算符和strlen函數

sizeof sizeof是C語言的內置運算符&#xff0c;以字節為單位給出指定類型的大小。 程序&#xff1a; #include <stdio.h>int main(void) {int a8;int b sizeof(a);//printf("a占用字節%u\n",sizeof(a));printf("a占用字節%d\n",b);return 0; }反匯…

Java接口程序練習

題目&#xff1a; 編寫一個接口程序&#xff0c;其中定義一個計算體積的方法。然后&#xff0c;在設計應用程序實現這個接口&#xff0c;分別計算矩形柱面體積和圓形柱面體積。 代碼如下&#xff1a; import java.util.*;//導入掃描儀&#xff1b; public class clown {publi…

[原]Asp.net替換不同版本的Dll文件碰到的問題以及解決辦法.

情景還原: 今天一個朋友說網站不能上傳圖片,我檢查后發現一直卡住在上傳頁面,一直滾動,是個Fckeditor控件2.6.3的. 經過google以后得到的結論是圖片上傳成功,但是沒有返回結果,在服務器上可以看到上傳的圖片. 說明是上傳控件有問題,程序不能返回結果. 再google以后發現有人已經…

疊筐

Problem Description 需要的時候&#xff0c;就把一個個大小差一圈的筐疊上去&#xff0c;使得從上往下看時&#xff0c;邊筐花色交錯。這個工作現在要讓計算機來完成&#xff0c;得看你的了。 Input 輸入是一個個的三元組&#xff0c;分別是&#xff0c;外筐尺寸n&#xff…

“Visual Studio.net已檢測到指定的Web服務器運行的不是Asp.net1.1版。您將無法運行Asp.net Web應用程序或服務”問題的解決方案...

解決方案一&#xff1a; 1.確定有安裝.net framework 1.1&#xff0c;可以查看目錄&#xff0c;c:\winnt\microsoft.net\framework重啟IIS&#xff0c;重啟計算機&#xff08;常規糾錯方法&#xff09; 2.如果你的Web服務器使用了固定IP&#xff1a;確定你的“Internet信息服務…

【桶】220.存在重復元素 III 【LeetCode】

220.存在重復元素 III 【LeetCode】 給你一個整數數組 nums 和兩個整數 k 和 t。請你判斷是否存在 兩個不同下標i和j&#xff0c;使得 abs(nums[i] - nums[j]) < t&#xff0c;同時又滿足 abs(i - j) < k。 如果存在則返回 true&#xff0c;不存在返回 false。 示例 1…

遠控免殺專題12--Green-Hat-Suite免殺

0x01 免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全…

英語基礎語法(八)-時態

英語中&#xff0c;動詞時態的用法是尤其復雜和富于變化的。經常通過動詞詞尾、組動詞等的變化表明動作發生時間的先后順序&#xff0c;即時態。總的來說&#xff0c;英語中的動詞時態分為 三個基本類型&#xff1a; 現在、過去和將來。動詞時態的變化常常伴隨著相應的表示時間…

Java PushbackInputStream markSupported()方法與示例

PushbackInputStream類markSupported()方法 (PushbackInputStream Class markSupported() method) markSupported() method is available in java.io package. markSupported()方法在java.io包中可用。 markSupported() method is used to check whether this stream supports …

面型對象 (接口與類的區別)

public class Demo4_Interface {public static void main(String[] args) {某女星 clown new 某女星();clown.潛規則();clown.關系();} }/*親爹只有一個&#xff0c;是單繼承;干爹可以有很多個&#xff0c;是多實現;*/ interface 某干爹{public void 關系();public void 潛規…

遠控免殺專題 13----zirikatu免殺

0x01 免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全…

UML 的九種模型圖

1. UML的模型圖 UML 的模型圖能夠將被建模的系統的某一個方面的某一部分以圖形的方式表示出來&#xff0c;不同的視圖通過將多個不同的模型圖有機組合在一起就能夠描述系統模型的某方面的特征。UML的模型圖是有模型元素構成的&#xff0c;模型元素以圖標的形式直觀形象的表達…

【莫隊】區間眾數(Codeforces Round #716 (Div. 2) D)

D. Cut and Stick &#xff08;賽后補題&#xff09;借本題學習莫隊算法以及區間眾數的求法 題意&#xff1a;對于整型數組&#xff0c;每次詢問[L,R][L,R][L,R]區間問最少分為多少個子序列&#xff0c;使得每個子序列的眾數xxx的個數cntxcnt_xcntx?不大于 ?len2?\left \l…

如何正確使用SqlConnection

以前曾見過有人這樣寫代碼&#xff1a; public class Service1 : IService1{private SqlConnection conn new SqlConnection();public void Method1(){//do something with conn;}public void Method2(){//do something with conn;}public void Method3(){//do something with…