利用windows消息机制,截获特定应用程序里鼠标、键盘的消息事件

发布时间:2021-10-25 03:17:48

最*做一个项目,需要截获特定应用程序里鼠标和键盘的消息事件。之前本人对windows底层的消息处理机制并不熟悉,通过学*知道钩子机制可以帮助我们截获处理windows消息或特定事件,现将本人所掌握的知识内容总结如下:


1.调用windows底层API,定义winAPI类


? using System.Runtime.InteropServices;



public class WinApi
{
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
[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, IntPtr wParam, IntPtr lParam);
//安装钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
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", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
//获得系统当前窗体句柄
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
//获得窗体名称
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText();
}

2.定义鼠标钩子和键盘钩子


public class MouseHook
{
private Point point;
private Point Point
{
get { return point; }
set
{
if (point != value)
{
point = value;
}
}
}
private int hHook;
public const int WH_MOUSE_LL = 14;
public WinApi.HookProc hProc;
public MouseHook()
{
this.Point = new Point();
}
public int SetHook()
{
hProc = new WinApi.HookProc(MouseHookProc);
hHook = WinApi.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero,0);
return hHook;
}
public void UnHook()
{
WinApi.UnhookWindowsHookEx(hHook);
}
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return WinApi.CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
WinApi.MouseHookStruct MyMouseHookStruct = (WinApi.MouseHookStruct)Marshal.PtrToStructure
(lParam, typeof(WinApi.MouseHookStruct));
MouseButtons button = MouseButtons.None;
int clickCount = 0;
switch ((Int32)wParam)
{
case WM_LBUTTONDOWN:
button = MouseButtons.Left;
clickCount = 1;
var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);
MouseClick(this, e);
break;
case WM_MOUSEMOVE:
var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0);
MouseMove(this, e);
break;
}
this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y);
return WinApi.CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
//委托+事件(把钩到的消息封装为事件,由调用者处理)
public delegate void MouseMoveHandler(object sender, MouseEventArgs e);
public event MouseMoveHandler MouseMove;

public delegate void MouseClickHandler(object sender, MouseEventArgs e);
public event MouseClickHandler MouseClick;
}

public class KeyboardHook
{
private int hHook;
public WinApi.HookProc hProc;

public int SetHook()
{
hProc = new WinApi.HookProc(KeyboardHookProc);
hHook = WinApi.SetWindowsHookEx(WH_KEYBOARD_LL, hProc, IntPtr.Zero,0);
return hHook;
}
public void UnHook()
{
WinApi.UnhookWindowsHookEx(hHook);
}
private int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
WinApi.KeyboardHookStruct kbhs= (WinApi.KeyboardHookStruct)Marshal.PtrToStructure(lParam,
typeof(WinApi.KeyboardHookStruct));
Keys key = (Keys)kbhs.vkCode;
switch ((Int32)wParam)
{
case WM_KEYDOWN:
var e = new KeyEventArgs(key);
KeyDown(this, e);
break;
case WM_KEYUP:
var e1 = new KeyEventArgs(key);
KeyUp(this, e1);
break;
}
}
return WinApi.CallNextHookEx(hHook, nCode, wParam, lParam);
}
//委托+事件(把钩到的消息封装为事件,由调用者处理)
public delegate void KeyDownEventHandler(object sender, KeyEventArgs e);
public delegate void KeyUpEventHandler(object sender, KeyEventArgs e);

public event KeyDownEventHandler KeyDown;
public event KeyUpEventHandler KeyUp;
}

3.应用程序调用

MouseHook mh;
KeyboardHook kh;
public Form1()
{
InitializeComponent();
//启动程序自动隐藏窗体
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
SetVisibleCore(false);
}
private void Form1_Load(object sender, EventArgs e)
{
mh = new MouseHook();
mh.SetHook();
mh.MouseMove += mh_MouseMove;
mh.MouseClick += mh_MouseClick;
kh = new KeyboardHook();
kh.SetHook();
kh.KeyDown += kh_KeyDown;
kh.KeyUp += kh_KeyUp;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
mh.UnHook();
kh.UnHook();
}
private void mh_MouseMove(object sender, MouseEventArgs e)
{
}
private void mh_MouseClick(object sender, MouseEventArgs e)
{
}
private void kh_KeyDown(object sender, KeyEventArgs e)
{
}
private void kh_KeyUp(object sender, KeyEventArgs e)
{
}


相关文档

  • 苹果5和4s哪个好?苹果5和4s两款机型全面解析
  • 为自己喝彩的读后感
  • 最新的四川概况导游词合集
  • vmware 常用知识
  • 三星w2019怎么验机
  • rust腐蚀租服务器多少钱_高防服务器租用多少钱一个月?
  • 儿童长高营养食谱 推荐一组青少年营养食谱和增高食谱
  • 怎么注销爱奇艺账号
  • 酒渣鼻的中医治疗方法,酒渣鼻中药治疗
  • 吊顶扣板的选购存在哪些误区
  • 关于语文的手抄报的图片
  • 自考《经济思想史》知识点:德国历史学派经济学说
  • WPS文字怎么设置字符底纹呢?字符底纹设置方法
  • 给小孩办理护照需要小孩本人的身份证吗
  • 高尔夫教学:软球和硬球的差异
  • 华为手机和苹果手机哪个好
  • sql分组取组内的最新数据
  • 2017年道路运输从业资格证考试模拟试题
  • 那个帅小伙作文600字
  • Formz.Renderzone.Plus.v6.5.4-ISO 1CD (建模软件)
  • xubuntu12.04配置
  • 南京薰衣草庄园门票价格?南京薰衣草庄园门票多少钱?
  • 空间哲理签名
  • 我们班的流行风小学作文
  • tik tok国际版怎么用
  • 浮点数在计算机内存中的储存方式。
  • 竞聘演讲现场把握态势语的方法
  • 怎么把电脑锁定要密码忘记了怎么办
  • 学习使用stm32f1驱动LCD屏
  • 关于含有云字的诗句
  • 猜你喜欢

  • 洁白的栀子花
  • 上海嘉定某社区736例消化性溃疡的特点分析
  • dbcp、c3p0 数据库连接池解释
  • 班组长一日管理
  • 年会策划方案流程及注意事项
  • 科技论文写作技巧大全
  • 凤台县大豆原种场企业信用报告-天眼查
  • 多晶硅片外观检验2
  • 【最新推荐】春雨为题目的写景作文-精选word文档 (1页)
  • 施华洛世奇钥匙项链寓意打开爱情的大门
  • 五矿钢铁计划会资料(10年11月)
  • 带着梦想出发_高中作文
  • 探讨如何提高组织学与胚胎学实验教学质量
  • 协作学*在教学实践中的应用研究
  • 构造物路基交底-16页精选文档
  • 南开19秋学期(1709、1803、1809、1903、1909)《移动营销》在线作业标准答案
  • 热热闹闹迎新年诗歌
  • 鄂教版三年级科学下册教案茎叶的生长
  • 湖南瀚超商务咨询服务有限公司企业信用报告-天眼查
  • 名师推荐第4讲螺纹连接
  • 小学一年级语文期中考试质量分析
  • MATLAB图像增强与变换处理
  • 编译器不正确造成的提示:ts_test: line 1: syntax error: unexpected \"(\"
  • 调研座谈会发言稿
  • 2018福建三明农信社招聘金融学知识:非银行金融机构
  • 建筑学专业分阶段书单(附推荐理由)
  • Linux中yum源配置及软件安装管理
  • 探讨油品质量检验误区及相关注意事项
  • 班主任的述职报告怎么写【四篇】
  • 小猫与小鱼
  • 保护生物的多样性说课稿
  • 炒股技巧与实战经验、指标运用
  • 房屋转让协议范文
  • 银行员工单位鉴定评语2020
  • 2019届高考英语一轮复*第一部分教材课文要点Module5ALessoninaLab语篇解题微技巧
  • 【精选】2019年高考历史一轮复*20世纪的战争与和*第38讲第一次世界大战与凡尔赛_华盛顿体系课件新人教版
  • 浅析我国企业供应链管理存在的问题及对策
  • 第20章晶闸管与其应用
  • 根癌农杆菌介导的反义VeFAD_2基因对少根根霉的遗传转化及其影响因子
  • 智能机器人产业的现状与未来
  • 单项选择题易错题集锦3
  • 有氧踏板操的选择及基本步法
  • 电脑版