最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C#實(shí)現(xiàn)的HOOK鍵盤(pán)鉤子實(shí)例代碼

 更新時(shí)間:2014年07月26日 15:26:03   投稿:shichen2014  
這篇文章主要介紹了基于C#實(shí)現(xiàn)的HOOK鍵盤(pán)鉤子實(shí)例,需要的朋友可以參考下

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

具體實(shí)現(xiàn)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 設(shè)置和屏蔽系統(tǒng)熱鍵
{
  class HOOK
  {
    #region 私有變量
 private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 鍵盤(pán)鉤子句柄
 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 鉤子委托聲明
 private HookProc m_KeyboardHookProcedure;/// 鍵盤(pán)鉤子委托實(shí)例
  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);
    /// 傳遞鉤子
    &nbsp; /// <param name="pHookHandle">是您自己的鉤子函數(shù)的句柄。用該句柄可以遍歷鉤子鏈</param>
    /// <param name="nCode">把傳入的參數(shù)簡(jiǎn)單傳給CallNextHookEx即可</param>
    /// <param name="wParam">把傳入的參數(shù)簡(jiǎn)單傳給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;//是否設(shè)置屏蔽熱鍵,false為設(shè)置屏蔽的熱鍵
    public static bool isHotkey = false;
    public static bool isInstall = false;//是否安裝鉤子,true為安裝
    #endregion
    #region 事件的聲明
    public event KeyEventHandler KeyDown;//鍵盤(pán)按下事件
    public event KeyEventHandler KeyUp;//鍵盤(pán)松開(kāi)事件
    public event KeyPressEventHandler KeyPress;//鍵盤(pán)單擊事件
    #endregion
    #region 方法
    /// <summary>
    /// 鉤子捕獲消息后,對(duì)消息進(jìn)行處理
    /// </summary>
    /// <param nCode="int">標(biāo)識(shí),鍵盤(pán)是否操作</param> 
    /// <param wParam="int">鍵盤(pán)的操作值</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));//獲取鉤子的相關(guān)信息
        KeyEventArgs e = new KeyEventArgs((Keys)(keyboardHookStruct.vkCode));//獲取KeyEventArgs事件的相磁信息
        switch (wParam)
        {
          case WM_KEYDOWN://鍵盤(pán)按下操作
          case WM_SYSKEYDOWN:
            if (KeyDown != null)//如果加載了當(dāng)前事件
            {
              KeyDown(this, e);//調(diào)用該事件
            }
            break;
          case WM_KEYUP://鍵盤(pán)松開(kāi)操作
          case WM_SYSKEYUP:
            if (KeyUp != null)//如果加載了當(dāng)前事件
            {
              KeyUp(this, e);//調(diào)用該事件
            }
            break;
        }
      }
      return pp;//是否屏蔽當(dāng)前熱鍵,1為屏蔽,2為執(zhí)行
    }
    #endregion
    #region 安裝、卸載鉤子
    /// <summary>
    /// 安裝鉤子
    /// </summary>
    /// <returns>是否安裝成功</returns>
    public bool Start()
    {
      IntPtr pInstance = (IntPtr)4194304;//鉤子所在實(shí)例的句柄
      if (this.m_pKeyboardHook == IntPtr.Zero)//如果鍵盤(pán)的句柄為空
      {
        this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);//聲明一個(gè)托管鉤子
        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)//如果沒(méi)有安裝鉤子
      {
        return true;
      }
      bool result = true;
      if (this.m_pKeyboardHook != IntPtr.Zero)//如果安裝了鉤子
      {
        result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);//卸載鉤子
        this.m_pKeyboardHook = IntPtr.Zero;//清空鍵盤(pán)的鉤子句柄
      }
      return result;
    }
    #endregion 公共方法
  }
}

相關(guān)文章

最新評(píng)論

内黄县| 临朐县| 德昌县| 丰顺县| 宜良县| 尤溪县| 阳城县| 裕民县| 泗洪县| 林口县| 清远市| 昌都县| 南安市| 蕉岭县| 新巴尔虎左旗| 万年县| 山西省| 永平县| 敦化市| 醴陵市| 汶川县| 昭通市| 乌兰县| 麻阳| 安远县| 遵化市| 木里| 景东| 卓尼县| 荃湾区| 巴青县| 百色市| 潢川县| 芦溪县| 大连市| 高邑县| 台江县| 兰西县| 汾西县| 屏山县| 长岛县|