zoukankan
html css js c++ java
C#.Net的全局键盘钩子(Hook)技术
using
System;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
using
System.Reflection;
namespace
HookDll
{
public
class
HookDll
{
private
KBDLLHOOKSTRUCT kbdllhs;
private
IntPtr iHookHandle
=
IntPtr.Zero;
private
GCHandle _hookProcHandle;
public
delegate
IntPtr HookProc(
int
nCode, IntPtr wParam, IntPtr lParam);
[DllImport(
"
user32.dll
"
, CharSet
=
CharSet.Auto)]
public
static
extern
IntPtr SetWindowsHookEx(
int
hookid, HookProc pfnhook, IntPtr hinst,
int
threadid);
[DllImport(
"
user32.dll
"
, CharSet
=
CharSet.Auto, ExactSpelling
=
true
)]
public
static
extern
bool
UnhookWindowsHookEx(IntPtr hhook);
[DllImport(
"
user32.dll
"
, CharSet
=
CharSet.Auto, ExactSpelling
=
true
)]
public
static
extern
IntPtr CallNextHookEx(IntPtr hhook,
int
code, IntPtr wparam, IntPtr lparam);
[DllImport(
"
kernel32.dll
"
,CharSet
=
CharSet.Auto, CallingConvention
=
CallingConvention.StdCall)]
private
static
extern
IntPtr GetModuleHandle(
string
lpModuleName);
[DllImport(
"
Kernel32.dll
"
,EntryPoint
=
"
RtlMoveMemory
"
)]
public
static
extern
void
CopyMemory (
ref
KBDLLHOOKSTRUCT Source,IntPtr Destination,
int
Length);
private
const
int
WH_KEYBOARD
=
13
;
public
void
DisableKBDHook()
{
try
{
if
(iHookHandle
!=
IntPtr.Zero)
{
UnhookWindowsHookEx(iHookHandle);
}
_hookProcHandle.Free();
iHookHandle
=
IntPtr.Zero;
}
catch
{
return
;
}
}
public
void
EnableKBDHook()
{
HookProc hookProc
=
new
HookProc(KBDDelegate);
_hookProcHandle
=
GCHandle.Alloc(hookProc);
iHookHandle
=
SetWindowsHookEx(WH_KEYBOARD, hookProc, GetModuleHandle(
"
HookDll.dll
"
),
0
);
if
(iHookHandle
==
IntPtr.Zero)
{
throw
new
System.Exception(
"
错误,钩子失败!
"
);
}
}
public
IntPtr KBDDelegate(
int
iCode , IntPtr wParam,IntPtr lParam)
{
kbdllhs
=
new
KBDLLHOOKSTRUCT();
CopyMemory(
ref
kbdllhs, lParam,
20
);
//
结果就在这里了^_^
int
iHookCode
=
kbdllhs.vkCode;
DisableKBDHook();
EnableKBDHook();
return
CallNextHookEx(iHookHandle, iCode, wParam,lParam);
}
}
[StructLayout(LayoutKind.Sequential)]
public
struct
KBDLLHOOKSTRUCT
{
public
int
vkCode;
public
int
scanCode;
public
int
flags;
public
int
time;
public
int
dwExtraInfo;
}
}
查看全文
相关阅读:
28335外部中断的简单介绍和配置
C++中强制类型转换
GitHub上Markdown语法的高级应用
C++中强制类型转换
模拟鼠标点击事件
clone一行div tr 每次增量赋值
linux tomcat自动部署shell
maven 引用本地jar
JDK自带工具keytool生成ssl证书
jenkins+maven+svn实现简单的一键发布
原文地址:https://www.cnblogs.com/MaxWoods/p/1205221.html
最新文章
《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(伯篇)——执行环境与元数据清理器
《深入理解Spark:核心思想与源码分析》(第2章)
2015年阿里工作与生活回顾
《深入理解Spark:核心思想与源码分析》(前言及第1章)
《深入理解Spark:核心思想与源码分析》正式出版上市
Linux:更改hostname主机名
Linux:Aircrack-ng
Linux:运行级别,root密码重置,救援模式,安装图形化界面
Linux:cd命令详解
Linux:declare命令详解
热门文章
Linux:LAMP搭建DISCU!论坛
Linux:ln命令详解(软连接,硬链接)
Linux:grub密码设置与修改
linux:系统启动流程
Linux:mii-tool命令详解
matlab函数拟合
C++命名空间学习笔记
C++函数学习笔记
C++树的插入和遍历(关于指针的指针,指针的引用的思考)
Quartus11中新建工程
Copyright © 2011-2022 走看看