static int hHook = 0;
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;
public const int WH_KEYBOARD_LL = 13;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//设置钩子
[DllImport("user32.dll")]
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")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); [DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId(); [DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name); public void Hook_Start()
{
// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0); //如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
} } } //取消钩子事件
public void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
} //这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (kbh.vkCode == 91) // 截获左win(开始菜单键)
{
return 1;
}
if (kbh.vkCode == 92)// 截获右win
{
return 1;
}
if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截获Ctrl+Esc
{
return 1;
}
if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+f4
{
return 1;
}
if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+tab
{
return 1;
}
if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift+Esc
{
return 1;
}
if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+空格
{
return 1;
}
if (kbh.vkCode == 241) //截获F1
{
return 1;
}
//if (kbh.vkCode == (int)Keys.Delete && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Delete
//{
// return 1;
//}
if (kbh.vkCode == 122) //截取F11
{
return 1;
} }
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

  

最新文章

  1. win10怎么取消登录密码
  2. iocp-socket 服务(借鉴别人的,根据自己的需要改的)未完待续
  3. C#部分---"++"在前在后的区别。
  4. expdp导出数据库
  5. [原]TCP/UDP使用细节备忘
  6. silverlight 控件自定义样式 实现方法
  7. 《Android View 的事件分发和滑动冲突》 —预习资料
  8. C程序中唯一序列号的生成
  9. WPF 自定义滚动条样式
  10. 从头开始-01.C语言环境测试
  11. 硬盘重装Ubuntu12.04的感受
  12. webService接口交互
  13. 一个最简单的cell按钮点击回调
  14. Redis --> 为redis分配新的端口
  15. swust oj 1051
  16. 服务器资源监控插件(jmeter)
  17. python中的多重循环
  18. 19迭代模式Iterator
  19. 动态规划入门——数字三角形(Java)
  20. [翻译] USING GIT IN XCODE [5] 在XCODE中使用GIT[5]

热门文章

  1. 可视化限流管理,Sentinel 控制台启动和接入
  2. 【中文乱码】深入分析 Java Web 中的中文编码问题
  3. Catch That Cow (简单BFS+剪枝)
  4. printf 函数笔记
  5. Shell重定向与exec
  6. 【WPF学习】第二十九章 元素绑定——将元素绑定到一起
  7. 基于 Serverless +企业微信打造 nCoV 疫情监控小助手
  8. Flink安装及实例教程
  9. 2018icpc南京现场赛-G Pyramid(打标找规律+逆元)
  10. 【redis】-- redis的持久化(作为数据库)