国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

基于C#實現的HOOK鍵盤鉤子實例代碼

2020-01-24 02:37:54
字體:
來源:轉載
供稿:網友

本文所述為基于C#實現的HOOK實例,該實例可用來屏蔽系統熱鍵。程序主要實現了安裝鉤子、傳遞鉤子、卸載鉤子等功能。在傳遞鉤子中:
<param name="pHookHandle">是您自己的鉤子函數的句柄。用該句柄可以遍歷鉤子鏈</param>
<param name="nCode">把傳入的參數簡單傳給CallNextHookEx即可</param>
<param name="wParam">把傳入的參數簡單傳給CallNextHookEx即可</param>,
在HOOK類中定義了一些私有變量:鍵盤鉤子句柄、鍵盤鉤子委托實例、底層的鉤子變量等。在鉤子捕獲消息后,對消息進行處理。

具體實現HOOK代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection;using System.IO;namespace 設置和屏蔽系統熱鍵{  class HOOK  {    #region 私有變量 private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 鍵盤鉤子句柄 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 鉤子委托聲明 private HookProc m_KeyboardHookProcedure;/// 鍵盤鉤子委托實例  public const int idHook = 13;/// 底層的鉤子變量  [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]  public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadId);/// 安裝鉤子  [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]/// 卸載鉤子  public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);    /// 傳遞鉤子      /// <param name="pHookHandle">是您自己的鉤子函數的句柄。用該句柄可以遍歷鉤子鏈</param>    /// <param name="nCode">把傳入的參數簡單傳給CallNextHookEx即可</param>    /// <param name="wParam">把傳入的參數簡單傳給CallNextHookEx即可</param>    /// <param name="lParam"></param>    /// <returns></returns>    [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]    public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, Int32 wParam, IntPtr lParam);    [StructLayout(LayoutKind.Sequential)]    public struct KeyMSG    {      public int vkCode;      public int scanCode;      public int flags;      public int time;      public int dwExtraInfo;    }    protected const int WM_QUERYENDSESSION = 0x0011;    protected const int WM_KEYDOWN = 0x100;    protected const int WM_KEYUP = 0x101;    protected const int WM_SYSKEYDOWN = 0x104;    protected const int WM_SYSKEYUP = 0x105;    protected const byte VK_SHIFT = 0x10;    protected const byte VK_CAPITAL = 0x14;    protected const byte VK_NUMLOCK = 0x90;    protected const byte VK_LSHIFT = 0xA0;    protected const byte VK_RSHIFT = 0xA1;    protected const int VK_LWIN = 91;    protected const int VK_RWIN = 92;    protected const byte VK_LCONTROL = 0xA2;    protected const byte VK_RCONTROL = 0x3;    protected const byte VK_LALT = 0xA4;    protected const byte VK_RALT = 0xA5;    protected const byte LLKHF_ALTDOWN = 0x20;    public bool Porwer = true;//是否屏蔽Porwer鍵    public static int pp = 0;//熱鍵的返回值    public static bool isSet = false;//是否設置屏蔽熱鍵,false為設置屏蔽的熱鍵    public static bool isHotkey = false;    public static bool isInstall = false;//是否安裝鉤子,true為安裝    #endregion    #region 事件的聲明    public event KeyEventHandler KeyDown;//鍵盤按下事件    public event KeyEventHandler KeyUp;//鍵盤松開事件    public event KeyPressEventHandler KeyPress;//鍵盤單擊事件    #endregion    #region 方法    /// <summary>    /// 鉤子捕獲消息后,對消息進行處理    /// </summary>    /// <param nCode="int">標識,鍵盤是否操作</param>     /// <param wParam="int">鍵盤的操作值</param>    /// <param lParam="IntPtr">指針</param>    private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)    {      if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))      {        KeyMSG keyboardHookStruct = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//獲取鉤子的相關信息        KeyEventArgs e = new KeyEventArgs((Keys)(keyboardHookStruct.vkCode));//獲取KeyEventArgs事件的相磁信息        switch (wParam)        {          case WM_KEYDOWN://鍵盤按下操作          case WM_SYSKEYDOWN:            if (KeyDown != null)//如果加載了當前事件            {              KeyDown(this, e);//調用該事件            }            break;          case WM_KEYUP://鍵盤松開操作          case WM_SYSKEYUP:            if (KeyUp != null)//如果加載了當前事件            {              KeyUp(this, e);//調用該事件            }            break;        }      }      return pp;//是否屏蔽當前熱鍵,1為屏蔽,2為執行    }    #endregion    #region 安裝、卸載鉤子    /// <summary>    /// 安裝鉤子    /// </summary>    /// <returns>是否安裝成功</returns>    public bool Start()    {      IntPtr pInstance = (IntPtr)4194304;//鉤子所在實例的句柄      if (this.m_pKeyboardHook == IntPtr.Zero)//如果鍵盤的句柄為空      {        this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);//聲明一個托管鉤子        this.m_pKeyboardHook = SetWindowsHookEx(idHook, m_KeyboardHookProcedure, pInstance, 0);//安裝鉤子        if (this.m_pKeyboardHook == IntPtr.Zero)//如果安裝失敗        {          this.Stop();//卸載鉤子          return false;        }      }      isInstall = true;//安裝了鉤子      return true;    }    /// <summary>    /// 卸載鉤子    /// </summary>    /// <returns>是否卸載成功</returns>    public bool Stop()    {      if (isInstall == false)//如果沒有安裝鉤子      {        return true;      }      bool result = true;      if (this.m_pKeyboardHook != IntPtr.Zero)//如果安裝了鉤子      {        result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);//卸載鉤子        this.m_pKeyboardHook = IntPtr.Zero;//清空鍵盤的鉤子句柄      }      return result;    }    #endregion 公共方法  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清原| 亳州市| 来凤县| 徐水县| 尼木县| 长丰县| 山西省| 日土县| 霍邱县| 汕头市| 陕西省| 保康县| 南阳市| 砚山县| 康定县| 商水县| 清涧县| 襄垣县| 丁青县| 海伦市| 井研县| 天镇县| 望奎县| 定陶县| 曲靖市| 邯郸县| 保康县| 宁津县| 新竹市| 突泉县| 南通市| 靖远县| 民乐县| 尤溪县| 专栏| 枞阳县| 望城县| 当阳市| 阜南县| 江孜县| 时尚|