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;
}
}
查看全文
相关阅读:
iOS 自动续期订阅 恢复购买
iOS内购恢复购买
iOS内购自动续订
iOS苹果内购服务端技术方案
Spring4.x体系架构
Linux下MySQL主从复制(Binlog)的部署过程
Linux下MySQL多实例部署记录
Linux下MySQL基础及操作语法
Linux下Nginx基础应用
Linux下Apache(HTTP)基础知识梳理-运维笔记
原文地址:https://www.cnblogs.com/MaxWoods/p/1205221.html
最新文章
二、Abp vNext 基础篇丨框架搭建
一、Abp vNext 基础篇丨介绍
Excel
perl
bash/shell
GitLab CI
confluence7.4.0 docker 安装手册
ES常用API示例
巧用SpringBoot扩展点EnvironmentPostProcessor
为何实现了 Filter 的类,能自动添加到 filterChain 中?
热门文章
taowen / awesome-lowcode
NET Core 社区的工具 -- https://github.com/dotnetcore
将博客搬至CSDN
S2_SQL_第四章
NSTimer循环引用的几种解决方案
ios 两种方式扩大button点击范围
文档整理
iOS内购:自动续期订阅总结
iOS内购:自动续期订阅总结
iOS内购编程指南
Copyright © 2011-2022 走看看