zoukankan
html css js c++ java
hook
//---------------------------------------------------------------------------
//挂上、卸下Keyboard hook,并运用自定义信息传递Hook数据
//---------------------------------------------------------------------------
#include <vcl.h> //原有BCB 头文件
#include <windows.h> //原有window 头文件
#pragma hdrstop
#pragma argsused
//自定义的键盘信息,与执行文件TKeyHookForm中自定义的键盘信息相互对应
const
int
WM_KEYHOOK = WM_USER+100;
//---------------------------------------------------------------------------
//DLL的固定声明
HHOOK
hHook;
//挂上的hook handle
HWND
hAppWnd;
//执行此dll的特定exe程序handle__"TKeyHookForm"
HINSTANCE
inst;
//连接文件的模块handle,固定行程
//---------------------------------------------------------------------------
//符合以C语言编译的DLL输出函数
extern
"C"
{
__declspec
(
dllexport
) __stdcall
void
SetHook(
void
);
__declspec
(
dllexport
) __stdcall
void
RemoveHook(
void
);
}
//---------------------------------------------------------------------------
//重载的KeyboardProc函数,持续送出键盘全域信息
LRESULT
CALLBACK KeyboardProc(
int
,
WPARAM
,
LPARAM
);
//---------------------------------------------------------------------------
//DLL的构造函数与析构函数
int
WINAPI DllEntryPoint(
HINSTANCE
hinst, unsigned
long
reason,
void
*)
{
inst = hinst;
//当此DLL被调用or结束
switch
(reason)
{
case
DLL_PROCESS_ATTACH :
//此DLL构造函数
//取得执行此dll的特定程序handle
hAppWnd = ::FindWindow(
"TKeyHookForm"
, 0);
break
;
case
DLL_PROCESS_DETACH:
//此DLL析构函数
break
;
case
DLL_THREAD_ATTACH:
//此DLL多线程构造函数
break
;
case
DLL_THREAD_DETACH:
//此DLL多线程析构函数
break
;
}
return
1;
}
//---------------------------------------------------------------------------
//注册自定义hook到hook链中
void
__stdcall SetHook(
void
)
{
//若Hook尚未挂上信息链中,则将本鼠标信息dll注册至hook链中
if
(hHook == NULL)
{
hHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, inst, 0);
//显示是否挂上hook,测试用!
if
(hHook == NULL)
MessageBox(NULL,
"Sorry! 无法挂上Hook。"
,
"Hook DLL"
, MB_OK);
else
::TextOut(GetDC(0),10,10,
"挂上Hook。"
,10);
}
}
//---------------------------------------------------------------------------
//在hook链中,解除自定义的hook
void
__stdcall RemoveHook(
void
)
{
//若Hook已经挂上信息链,则卸下此Hook信息
if
(hHook != NULL)
{
if
(::UnhookWindowsHookEx(hHook) != FALSE)
{
hHook = NULL;
::TextOut(GetDC(0),50,10,
"释放Hook。"
,10);
}
else
//测试用!
MessageBox(NULL,
"Sorry! 无法释放Hook。"
,
"Hook DLL"
, MB_OK);
}
else
//测试用!
::TextOut(GetDC(0),80,10,
"Hook isn't NULL"
,16);
}
//---------------------------------------------------------------------------
//重载的KeyboardProc函数,持续送出键盘全域信息
LRESULT
CALLBACK KeyboardProc(
int
nCode,
WPARAM
wParam,
LPARAM
lParam)
{
//若未挂上Hook链或键盘无信息输出,就交予下一hook链
if
((nCode < 0) || nCode == HC_NOREMOVE)
return
::CallNextHookEx(hHook, nCode, wParam, lParam);
//若信息重复,则跳至下一hook链
if
(lParam & 0x40000000)
return
::CallNextHookEx(hHook, nCode, wParam, lParam);
//若在DLL建构式中,取得执行此dll的特定程序handle,即送出自定义键盘信息
if
(hAppWnd != NULL)
SendMessage(hAppWnd, WM_KEYHOOK, wParam, lParam);
return
::CallNextHookEx(hHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
粘贴自: <
http://read.pudn.com/downloads11/sourcecode/windows/47550/C++%20Builder%E4%B8%8EWindows%20API%E7%BB%8F%E5%85%B8%E8%8C%83%E4%BE%8B/Ch6_Hook(Keyboard%20&%20Mouse)/ch06-01-1/Hook_Keyboard_BCB3/keydll.cpp__.htm
>
通过 为知笔记 发布
查看全文
相关阅读:
BZOJ1093 [SCOI2003]字符串折叠
BZOJ1078 [SCOI2008]斜堆
BZOJ1089 [SCOI2003]严格n元树
BZOJ1031 [JSOI2007]字符加密
BZOJ1038 [ZJOI2008]瞭望塔
BZOJ1037 [ZJOI2008]生日聚会Party
BZOJ1041 [HAOI2008]圆上的整点
BZOJ1026 [SCOI2009]windy数
linux命令行计算器 <转>
正则的[]与()
原文地址:https://www.cnblogs.com/xe2011/p/594b34939916e070aad2e1e4d2ae8d04.html
最新文章
Linux 查看 80 端口的占用情况
iptables的设置
网站打不开,排错
shell之小括号、中括号、大括号
centos和Ubuntu区别
python中read、readline和readlines的区别
map 和 reduce
Python 可变对象和不可变对象
netperf 网络性能测试
date 命令详解
热门文章
echo 命令详解
Robot Framework 自动化测试--部署篇
使用LVS实现负载均衡原理及安装配置详解
Redhat 简单本地yum 配置
MYSQL数据库常用命令
linux 环境RPM 安装MYSQL5.6
KVM 通过virsh console连入虚拟机
VMware vSphere 5.x 与 vSphere 6.0各版本功能特性对比
BZOJ1048 [HAOI2007]分割矩阵
BZOJ1047 [HAOI2007]理想的正方形
Copyright © 2011-2022 走看看