几个月前我就想用C#做一个功能,统计键盘的按键次数,天天对着电脑敲键盘。能知道自己每天击打多少次键盘也挺有意思的,可惜的真心做不出来。有几位大神说可以用键盘钩子,但是没代码可以参考。这是也就不了了之了。各位大神有没有什么办法呀C#键盘统计|钩子

解决方案 »

  1.   

    钩子的确可以,你可以百度搜索 C#做的war3的改键的东西 自己参考下 做修改 就行了
      

  2.   

    http://blog.csdn.net/ws297636199/article/details/5487147这个东西 参考下
      

  3.   

    这个需要用到两个API函数SetWindowsHookEx和UnhookWindowsHookEx,需要重写一个委托,很久以前使用过,现在记不清了
      

  4.   


    我保存的demo,你试试using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using hook;
    namespace hook
    {
        public partial class Form1 : Form
        {
            private hook.KeyboardHookLib _keyboardHook = null;         public Form1()
          {
             InitializeComponent();
          }         int num = 0;
          private void button1_Click(object sender, EventArgs e)
          {
             //安装勾子 
             _keyboardHook = new hook.KeyboardHookLib();
             _keyboardHook.InstallHook(this.OnKeyPress);
          }
          
          private void button2_Click(object sender, EventArgs e)
          {
             //取消勾子 
             if (_keyboardHook != null) _keyboardHook.UninstallHook();
          }
          
          /// <summary> 
          /// 客户端键盘捕捉事件. 
          /// </summary> 
          /// <param name="hookStruct">由Hook程序发送的按键信息</param> 
          /// <param name="handle">是否拦截</param> 
          public void OnKeyPress(hook.KeyboardHookLib.HookStruct hookStruct, out bool handle)
          {
             handle = false; //预设不拦截任何键 
             
             if (hookStruct.vkCode == 91) // 截获左win(开始菜单键)
             {
                handle = true;
             }
             
             if (hookStruct.vkCode == 92)// 截获右win
             {
                handle = true;
             }
             
             //截获Ctrl+Esc 
             if (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)
             {
                handle = true;
             }
             
             //截获alt+f4 
             if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)
             {
                handle = true;
             }
             
             //截获alt+tab 
             if (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)
             {
                handle = true;
             }
             
             //截获F1 
             if (hookStruct.vkCode == (int)Keys.F1)
             {
                handle = true;
             }
             
             //截获Ctrl+Alt+Delete 
             if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)
             {
                handle = true;
             }
             
             //如果键A~Z 
             if (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z)
             {
                //挡掉B键 
                if (hookStruct.vkCode == (int)Keys.B)
                hookStruct.vkCode = (int)Keys.None; //设键为0 
                
                handle = true;
             }
             
             Keys key = (Keys)hookStruct.vkCode;
             num++;
             label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString())+"   按下次数是:"+num.ToString();
             
          }
       }
    }using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;
    using System.Diagnostics;
    using Microsoft.Win32;
    using System.Windows.Forms; namespace hook
    {
       /// <summary> 
       /// 键盘Hook管理类, by www.vjsdn.com 易学原创 
       /// </summary> 
       public class KeyboardHookLib
       {
          private const int WH_KEYBOARD_LL = 13; //键盘 
          
          //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法. 
          private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);
          
          //客户端键盘处理事件 
          public delegate void ProcessKeyHandle(HookStruct param, out bool handle);
          
          //接收SetWindowsHookEx返回值 
          private static int _hHookValue = 0;
          
          //勾子程序处理事件 
          private HookHandle _KeyBoardHookProcedure;
          
          //Hook结构 
          [StructLayout(LayoutKind.Sequential)]
          public class HookStruct
          {
             public int vkCode;
             public int scanCode;
             public int flags;
             public int time;
             public int dwExtraInfo;
          }
          
          //设置钩子 
          [DllImport("user32.dll")]
          private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);
          
          //取消钩子 
          [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
          private static extern bool UnhookWindowsHookEx(int idHook);
          
          //调用下一个钩子 
          [DllImport("user32.dll")]
          private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
          
          //获取当前线程ID 
          [DllImport("kernel32.dll")]
          private static extern int GetCurrentThreadId();
          
          //Gets the main module for the associated process. 
          [DllImport("kernel32.dll")]
          private static extern IntPtr GetModuleHandle(string name);
          
          private IntPtr _hookWindowPtr = IntPtr.Zero;
          
          //构造器 
          public KeyboardHookLib() { }
          
          //外部调用的键盘处理事件 
          private static ProcessKeyHandle _clientMethod = null;
          
          /// <summary> 
          /// 安装勾子 
          /// </summary> 
          /// <param name="hookProcess">外部调用的键盘处理事件</param> 
          public void InstallHook(ProcessKeyHandle clientMethod)
          {
             _clientMethod = clientMethod;
             
             // 安装键盘钩子 
             if (_hHookValue == 0)
             {
                _KeyBoardHookProcedure = new HookHandle(OnHookProc);
                
                _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
                
                _hHookValue = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                _KeyBoardHookProcedure,
                _hookWindowPtr,
                0);
                
                //如果设置钩子失败. 
                if (_hHookValue == 0) UninstallHook();
             }
          }
          
          //取消钩子事件 
          public void UninstallHook()
          {
             if (_hHookValue != 0)
             {
                bool ret = UnhookWindowsHookEx(_hHookValue);
                if (ret) _hHookValue = 0;
             }
          }
          
          //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 
          private static int OnHookProc(int nCode, int wParam, IntPtr lParam)
          {
             if (nCode >= 0)
             {
                //转换结构 
                HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
                
                if (_clientMethod != null)
                {
                   bool handle = false;
                   //调用客户提供的事件处理程序。 
                   _clientMethod(hookStruct, out handle);
                   if (handle) return 1; //1:表示拦截键盘,return 退出 
                }
             }
             return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
          }
          
       }
    }
      

  5.   

    你的方法我试了 能够记录 但是我开启记录以后到其他的窗口输入的东西都被截止了啊 网页上恕不进去东西了你讲OnKeyPress()事件中所有的截获操作注释掉,就可以正常使用了。