C#中使用Hook

  C#中使用Hook

要屏蔽Acrobat Reader软件中的保存功能,我把工具栏隐藏掉,为了避免用户使用快捷键(F8)显示工具栏和(Ctrl+Shift+S)保存文件,我面临了要截取键盘的任务!

由于是使用API,以前Hook在C++中使用的比较多,我在网上查到原来在C#中一样也能实现截取键盘的Hook,相关程序如下:

 public class Browser : System.Windows.Forms.Form

 {

  public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

  static int hHook = 0;

  public const int WH_KEYBOARD_LL = 13; //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。

  HookProc KeyBoardHookProcedure;

  [StructLayout(LayoutKind.Sequential)]

  public class KeyBoardHookStruct

  {

   public int  vkCode;

   public int  scanCode;

   public int  flags;

   public int  time;

   public int  dwExtraInfo;

  }

  #region DllImport

  [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,IntPtr wParam, IntPtr lParam);

  #endregion

  public static int KeyBoardHookProc(int nCode,IntPtr wParam, IntPtr lParam)

  {

   if (nCode >= 0)

   {

    KeyBoardHookStruct kbh = (KeyBoardHookStruct) Marshal.PtrToStructure(lParam,typeof(KeyBoardHookStruct));

    if(kbh.vkCode == (int)Keys.F8)  // 截获F8

    {

     //MessageBox.Show ("Catch you!");

     return 1;

    }

    if(kbh.vkCode == (int)Keys.S

     && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift )  //截获Ctrl+Shift+S 

    {

     //MessageBox.Show ("No Save");

     return 1;

    }

    

   }

   return CallNextHookEx(hHook, nCode, wParam, lParam);

  }

  public void Start()

  {   

   // install Keyboard hook

   if(hHook == 0)

   {

    KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

    hHook = SetWindowsHookEx( WH_KEYBOARD_LL,

     KeyBoardHookProcedure,

     Marshal.GetHINSTANCE(

     Assembly.GetExecutingAssembly().GetModules()[0]),

     0);

    //If SetWindowsHookEx fails.

    if(hHook == 0 ) 

    {

     Stop();

     throw new Exception("SetWindowsHookEx ist failed.");

    }

   }

  }

  public void Stop()

  {

   bool retKeyboard = true;

   

   if(hHook != 0)

   {

    retKeyboard = UnhookWindowsHookEx(hHook);

    hHook = 0;

   }

   

   //If UnhookWindowsHookEx fails.

   if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");

  }

  private void Browser_Load(object sender, System.EventArgs e)

  {

   this.Start ();

  }

  private void menuLogout_Click(object sender, System.EventArgs e)

  {

   this.Stop ();

   this.Close ();

  }

看上去C#里使用Hook并不比C++中难,有时还要简单!但是一般编程用不到这个,我做这个东西想的太复杂了!

附录:

以下是一位网友制作的封装Hook调用的C#类,放在这里作为参考

// ***********************************************************************

//  LocalWindowsHook class

//  Dino Esposito, summer 2002

//

//  Provide a general infrastructure for using Win32

//  hooks in .NET applications

//

// ***********************************************************************

using System;

using System.Runtime.InteropServices;

namespace Win32API

{

    #region Class HookEventArgs

    public class HookEventArgs : EventArgs

    {

        public int HookCode;    // Hook code

        public IntPtr wParam;    // WPARAM argument

        public IntPtr lParam;    // LPARAM argument

    }

    #endregion

    #region Enum HookType

    // Hook Types

    public enum HookType : int

    {

        WH_JOURNALRECORD = 0,

        WH_JOURNALPLAYBACK = 1,

        WH_KEYBOARD = 2,

        WH_GETMESSAGE = 3,

        WH_CALLWNDPROC = 4,

        WH_CBT = 5,

        WH_SYSMSGFILTER = 6,

        WH_MOUSE = 7,

        WH_HARDWARE = 8,

        WH_DEBUG = 9,

        WH_SHELL = 10,

        WH_FOREGROUNDIDLE = 11,

        WH_CALLWNDPROCRET = 12,       

        WH_KEYBOARD_LL = 13,

        WH_MOUSE_LL = 14

    }

    #endregion

    #region WindowsHook

    public class WindowsHook

    {

        // ************************************************************************

        // Filter function delegate

        public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

        // ************************************************************************

        // ************************************************************************

        // Internal properties

        protected IntPtr m_hhook = IntPtr.Zero;

        protected HookProc m_filterFunc = null;

        protected HookType m_hookType;

        // ************************************************************************

       

        // ************************************************************************

        // Event delegate

        public delegate void HookEventHandler(object sender, HookEventArgs e);

        // ************************************************************************

        // ************************************************************************

        // Event: HookInvoked

        public event HookEventHandler HookInvoked;

        protected void OnHookInvoked(HookEventArgs e)

        {

            if (HookInvoked != null)

                HookInvoked(this, e);

        }

        // ************************************************************************

        // ************************************************************************

        // Class constructor(s)

        public WindowsHook(HookType hook)

        {

            m_hookType = hook;

            m_filterFunc = new HookProc(this.CoreHookProc);

        }

        public WindowsHook(HookType hook, HookProc func)

        {

            m_hookType = hook;

            m_filterFunc = func;

        }       

        // ************************************************************************

   

        // ************************************************************************

        // Default filter function

        protected int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)

        {

            if (code < 0)

                return CallNextHookEx(m_hhook, code, wParam, lParam);

            // Let clients determine what to do

            HookEventArgs e = new HookEventArgs();

            e.HookCode = code;

            e.wParam = wParam;

            e.lParam = lParam;

            OnHookInvoked(e);

            // Yield to the next hook in the chain

            return CallNextHookEx(m_hhook, code, wParam, lParam);

        }

        // ************************************************************************

        // ************************************************************************

        // Install the hook

        public void Install()

        {

            m_hhook = SetWindowsHookEx(

                m_hookType,

                m_filterFunc,

                IntPtr.Zero,

                (int) AppDomain.GetCurrentThreadId());

        }

        // ************************************************************************

        // ************************************************************************

        // Uninstall the hook

        public void Uninstall()

        {

            UnhookWindowsHookEx(m_hhook);

        }

        // ************************************************************************

 

        #region Win32 Imports

        // ************************************************************************

        // Win32: SetWindowsHookEx()

        [DllImport("user32.dll")]

        protected static extern IntPtr SetWindowsHookEx(HookType code,

            HookProc func,

            IntPtr hInstance,

            int threadID);

        // ************************************************************************

        // ************************************************************************

        // Win32: UnhookWindowsHookEx()

        [DllImport("user32.dll")]

        protected static extern int UnhookWindowsHookEx(IntPtr hhook);

        // ************************************************************************

        // ************************************************************************

        // Win32: CallNextHookEx()

        [DllImport("user32.dll")]

        protected static extern int CallNextHookEx(IntPtr hhook,

            int code, IntPtr wParam, IntPtr lParam);

        // ************************************************************************

        #endregion

    }

    #endregion

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值