c#-全局键盘钩子
2024-09-25 13:51:03
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace WebClick_Tool
{
public class KeyPress_o
{
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
//委托
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
static HookProc KeyBoardHookProcedure;
//设置钩子
[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 static void Hook_Start()
{
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
//如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
}
}
}
/// <summary>
/// 取消钩子事件
/// </summary>
public static void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
}
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
Keys k = (Keys)Enum.Parse(typeof(Keys), kbh.vkCode.ToString());
switch (k)
{
case Keys.F2:
if (kbh.flags == 0)
{
// 这里写按下后做什么事
//Main.GB = true;
MainForm.Fs(FormBorderStyle.FixedSingle);
MainForm.StopAll = true;
MainForm.DisMes("停止...");
MainForm.Enb(true);
}
else if (kbh.flags == 128)
{
//放开后做什么事
}
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
}
最新文章
- Hibernate框架简述 内部资料 请勿转载 谢谢合作
- WP老杨解迷:如何获得更多的应用评价和解读内容刷新
- HDU 3351
- [转]Golang- import 导入包的语法
- Mongo DB 安装-及分布式集群部署(初稿)
- Lucene 4.x实践1
- jquery.cookie用法详细解析
- [Ioi2005]River
- asp 域名跳转
- Python的基础--对象
- GCD(1222)Wolf and Rabbit
- Vxlan与网卡offload性能
- Java基础——集合源码解析 List List 接口
- img之间的间隙问题
- hashChange &; url change &; QRCode &; canvas to image
- Jmeter转换成中文模式
- Fedora 系统屏幕亮度修改
- Day033--Python--进程
- [转载]linux awk命令详解
- Android------------------RecyclerView学习
热门文章
- Java 语言基础 01
- Protobuf在Cmake中的正确使用
- LNMP配置——Nginx配置 —— 用户认证
- 一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程
- python基础学习之函数进阶【匿名函数、作用域关系、闭包、递归】
- Java中的Set集合
- 【Azure Developer】Github Action部署资源(ARM模板)到Azure中国区时,遇见登录问题的解决办法
- idea报错Selected Java version 11 is not supported by SDK (maximum 8)
- 用Python优雅的写出送给女儿的藏头诗
- 系统编程-信号-信号发送kill、raise、alarm