+ -
当前位置:首页 → 问答吧 → C# 全局钩子类 无法正常使用

C# 全局钩子类 无法正常使用

时间:2011-12-12

来源:互联网

public class KeyboardHook  
  {
  public event KeyEventHandler KeyDown;
  public event KeyEventHandler KeyUp;
  public event KeyPressEventHandler KeyPress;

  public delegate IntPtr HookProc(int ncode, IntPtr wparam, IntPtr lparam);
  private IntPtr nextHookPtr = IntPtr.Zero; //记录Hook编号  
  private HookProc hookProc;  

  public enum HookType //枚举,钩子的类型 WindowsMessageHook  
  {
  MsgFilter = -1,
  JournalRecord = 0,
  JournalPlayback = 1,
  Keyboard = 2,
  GetMessage = 3,
  CallWndProc = 4,
  CBT = 5,
  SysMsgFilter = 6,
  Mouse = 7,
  Hardware = 8,
  Debug = 9,
  Shell = 10,
  ForegroundIdle = 11,
  CallWndProcRet = 12,
  KeyboardLL = 13,
  MouseLL = 14
  }
  [StructLayout(LayoutKind.Sequential)]
  public class KeyboardHookStruct
  {
  public int vkCode; //定一个虚拟键码。该代码必须有一个价值的范围1至254 。 
  public int scanCode; // 指定的硬件扫描码的关键。 
  public int flags; // 键标志
  public int time; // 指定的时间戳记的这个讯息。
  public int dwExtraInfo; // 指定额外信息相关的信息。  
  }
   

  [DllImport("User32.dll")]//安装钩子
  public static extern IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID);
  [DllImport("User32.dll")]//回掉和处理
  public static extern IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);
  [DllImport("User32.dll")]//卸载钩子  
  public static extern void UnhookWindowsHookEx(IntPtr handle);
  [DllImport("kernel32.dll")]//卸载钩子  
  public static extern IntPtr GetModuleHandle(string name);

  private IntPtr myKeyBoardHook(int ncode, IntPtr wparam, IntPtr lparam)
  {
  if (ncode >= 0)
  {
  KeyboardHookStruct keyInfo = (KeyboardHookStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));

  //KeyboardHookStruct myKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lparam, typeof(KeyboardHookStruct));
  WriteTxt(keyInfo.vkCode.ToString());
  }
  return CallNextHookEx(nextHookPtr, ncode, wparam, lparam); //返回,让后面的程序处理该消息
  }
   
  public void SetKeyboardHook()  
  {
  if (nextHookPtr == IntPtr.Zero) 
  {
  //Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0])

  hookProc = new HookProc(this.myKeyBoardHook); //键盘事件消息处理函数  
  nextHookPtr = SetWindowsHookEx((int)HookType.KeyboardLL, hookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
  ;
   
  if (nextHookPtr == IntPtr.Zero) 
  {
  throw new Exception("设置Hook失败!");
  }
  }  
  }

  public void UnKeyboardHook()
  {  
  if (nextHookPtr != IntPtr.Zero)
  {
  UnhookWindowsHookEx(nextHookPtr); //从Hook链中取消
  nextHookPtr = IntPtr.Zero;
  }
  }  

  private void WriteTxt(string txtStr) 
  { 
  string Apppath=System.IO.Directory.GetCurrentDirectory();
  StreamWriter Sw = new StreamWriter(Apppath + "KeyBoard.txt");
  Sw.Write(txtStr);
  Sw.Close();
  }
  }


 我的一个键盘钩子类,全局的,调用的时候发现不起作用,断点发现我的委托不执行,就是断点在myKeyBoardHook方法不触发断点...帮看下如何解决。谢谢了

作者: CrazyCode1981   发布时间: 2011-12-12

自己顶下

作者: CrazyCode1981   发布时间: 2011-12-12

从哪里抄来的代码。这代码本来就不行。你还是再去换一个抄抄吧。

作者: caozhy   发布时间: 2011-12-12

全局钩子 好像必须放在一个单独的DLL文件当中吧

作者: hyttplay   发布时间: 2011-12-13