用户操作
[即时聊天] [发私信] [加为好友]
王会海ID:Ablan_Wang
425次访问,排名2万外好友0人,关注者1
性格:双重性格
爱好:睡觉,游戏,电影,足球
生活:做有价值的事情,做有价值的人
工作:适应是需要时间的,过段时间,一切都会好
教育:幼儿园毕业
Ablan_Wang的文章
原创 0 篇
翻译 0 篇
转载 3 篇
评论 0 篇
最近评论
文章分类
    收藏
      相册
      fsdf
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      转载 C#.Net的全局键盘钩子(Hook)技术收藏

       | 旧一篇: VS2008在功能和性能上有很大增强 但仍有些方面需要改善

      ///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请注明出处,并包含本声明 
      ///向无名的开源英雄致敬 2005-03-09
      ///
      using System;
      using System.Windows.Forms;
      using System.Runtime.InteropServices;
      using System.Reflection;
      namespace HookDll
      {
       public class HookDll
       {
        private KBDLLHOOKSTRUCT kbdllhs; 
        private IntPtr iHookHandle  =IntPtr.Zero;
        private GCHandle _hookProcHandle;
        public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);
        
        [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
        public static extern bool UnhookWindowsHookEx(IntPtr hhook);
       
        [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
        public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
        [DllImport("kernel32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
        [DllImport("Kernel32.dll",EntryPoint="RtlMoveMemory")] 
        public static extern void CopyMemory (ref KBDLLHOOKSTRUCT Source,IntPtr Destination,int Length);

        private const int WH_KEYBOARD = 13;
        
        public void DisableKBDHook()
        {
         try
         {
          if (iHookHandle!=IntPtr.Zero)
          {
           UnhookWindowsHookEx(iHookHandle);
          }
          _hookProcHandle.Free();
          iHookHandle = IntPtr.Zero;
         }
         catch
         {
          return;
         }
        }
        public void EnableKBDHook()
        { 
         HookProc hookProc = new HookProc(KBDDelegate);
         _hookProcHandle  = GCHandle.Alloc(hookProc);
         iHookHandle   = SetWindowsHookEx(WH_KEYBOARD, hookProc, GetModuleHandle("HookDll.dll"), 0);
         if (iHookHandle == IntPtr.Zero) 
         {
          throw new System.Exception("错误,钩子失败!");
         }
        }
        public IntPtr KBDDelegate(int iCode , IntPtr wParam,IntPtr lParam)
        {
         kbdllhs    = new KBDLLHOOKSTRUCT();
         CopyMemory(ref kbdllhs, lParam, 20);
         
         //结果就在这里了^_^
         int iHookCode = kbdllhs.vkCode;
         DisableKBDHook();
         EnableKBDHook();
         return CallNextHookEx(iHookHandle, iCode, wParam,lParam);
        }
       }
       [StructLayout(LayoutKind.Sequential)]
       public struct KBDLLHOOKSTRUCT
       {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
       }
      }

      发表于 @ 2008年05月09日 11:22:01|评论(loading...)|编辑

       | 旧一篇: VS2008在功能和性能上有很大增强 但仍有些方面需要改善

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © Ablan_Wang