c++钩子函数(react钩子函数)

结合自定义消息映射方面,作为学习的一个总结.Step1:创建win32动态链接库(anemptyprojectDLL),命名为HookDLL1:增加一个类,命名为DLL.cpp2:增加头文件#include<windows.h>#include"DLL.h"3:创建全局变量#pragmadata_seg("Shared")HHOOKmHoo…

大家好,又见面了,我是你们的朋友全栈君。


结合自定义消息映射方面,作为学习的一个总结.

Step1:创建win32动态链接库(an empty project DLL),命名为HookDLL

1:增加一个类,命名为DLL.cpp

2:增加头文件

#include <windows.h>

#include “DLL.h”

3:创建全局变量

#pragma data_seg(“Shared”)

HHOOK mHook=NULL;

HINSTANCE hInstance=NULL;

#pragma data_seg()

4:在DLL.cpp中增加实现几个函数

a.钩子回调函数 LRESULT WINAPI KeyProc(int code,WPARAM wParam,LPARAM lParam)

b. 入口函数

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

c. 供外界调用的启动与停止钩子函数

extern “C” __declspec(dllexport) BOOL WINAPI Start()

extern “C” __declspec(dllexport) void WINAPI Stop()

d.自定义消息:#define WM_Hook WM_USER+100

具体代码如下:

LRESULT WINAPI KeyProc(int code,WPARAM wParam,LPARAM lParam)

if(code==HC_ACTION && (lParam & 0xc000ffff) ==1)

char *sName;

BOOL b_sft=::GetAsyncKeyState (VK_SHIFT)>>((sizeof(short)*8)-1);

if(b_sft)

switch(wParam)

{

case ‘1’:sName=”!”; break;

case ‘2’:sName=”@”; break;

case ‘3’:sName = “#”;break;

case ‘4’:sName = “$”;break;

case ‘5’:sName = “%”;break;

case ‘6’:sName = “^”;break;

case ‘7’:sName = “&”;break;

case ‘8’:sName = “*”;break;

case ‘9’:sName = “(“;break;

case ‘0’:sName = “)”;break;

case ‘A’:sName = “A”;break;

case ‘B’:sName = “B”;break;

case ‘C’:sName = “C”;break;

case ‘D’:sName = “D”;break;

case ‘E’:sName = “E”;break;

case ‘F’:sName = “F”;break;

case ‘G’:sName = “G”;break;

case ‘H’:sName = “H”;break;

case ‘I’:sName = “I”;break;

case ‘J’:sName = “J”;break;

case ‘K’:sName = “K”;break;

case ‘L’:sName = “L”;break;

case ‘M’:sName = “M”;break;

case ‘N’:sName = “N”;break;

case ‘O’:sName = “O”;break;

case ‘P’:sName = “P”;break;

case ‘Q’:sName = “Q”;break;

case ‘R’:sName = “R”;break;

case ‘S’:sName = “S”;break;

case ‘T’:sName = “T”;break;

case ‘U’:sName = “U”;break;

case ‘V’:sName = “V”;break;

case ‘W’:sName = “W”;break;

case ‘X’:sName = “X”;break;

case ‘Y’:sName = “Y”;break;

case ‘Z’:sName = “Z”;break;

}

else

switch(wParam)

{

/*0~9*/

case ‘1’: sName=”1″; break;

case ‘2’:sName = “2”;break;

case ‘3’:sName = “3”;break;

case ‘4’:sName = “4”;break;

case ‘5’:sName = “5”;break;

case ‘6’:sName = “6”;break;

case ‘7’:sName = “7”;break;

case ‘8’:sName = “8”;break;

case ‘9’:sName = “9”;break;

case ‘0’:sName = “0”;break;

/*A~Z*/

case ‘A’:sName = “a”;break;

case ‘B’:sName = “b”;break;

case ‘C’:sName = “c”;break;

case ‘D’:sName = “d”;break;

case ‘E’:sName = “e”;break;

case ‘F’:sName = “f”;break;

case ‘G’:sName = “g”;break;

case ‘H’:sName = “h”;break;

case ‘I’:sName = “i”;break;

case ‘J’:sName = “j”;break;

case ‘K’:sName = “k”;break;

case ‘L’:sName = “l”;break;

case ‘M’:sName = “m”;break;

case ‘N’:sName = “n”;break;

case ‘O’:sName = “o”;break;

case ‘P’:sName = “p”;break;

case ‘Q’:sName = “q”;break;

case ‘R’:sName = “r”;break;

case ‘S’:sName = “s”;break;

case ‘T’:sName = “t”;break;

case ‘U’:sName = “u”;break;

case ‘V’:sName = “v”;break;

case ‘W’:sName = “w”;break;

case ‘X’:sName = “x”;break;

case ‘Y’:sName = “y”;break;

case ‘Z’:sName = “z”;break;

}

switch(wParam) //数字键

case VK_BACK:sName=”~”; break;

case VK_NUMPAD1:sName=”1″;break;

case VK_NUMPAD3:sName = “3”;break;

case VK_NUMPAD4:sName = “4”;break;

case VK_NUMPAD5:sName = “5”;break;

case VK_NUMPAD6:sName = “6”;break;

case VK_NUMPAD7:sName = “7”;break;

case VK_NUMPAD8:sName = “8”;break;

case VK_NUMPAD9:sName = “9”;break;

case VK_NUMPAD0:sName = “0”;break;

case VK_MULTIPLY:sName = “*”;break;

case VK_ADD:

sName=”+”;

break;

case VK_SUBTRACT:

sName=”-“;

break;

case VK_DECIMAL:

sName=”.”;

break;

case VK_DIVIDE:

sName=”/”;

break;

HWND H_wnd=::GetForegroundWindow ();

//自定义消息发送

::SendMessage (H_wnd,WM_Hook,wParam, (LPARAM)(LPCSTR)sName);

MessageBox(H_wnd,sName,”键盘提示”,MB_OK);

return CallNextHookEx( mHook, code, wParam, lParam );

BOOL APIENTRY DllMain(HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

switch(ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

hInstance=(HINSTANCE)hModule;

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

extern “C” __declspec(dllexport) BOOL WINAPI Start()

if(mHook!=NULL)   return FALSE;

//WH_KEYBOARD值为2,键盘消息钩子

//KeyProc 为回调函数

//hInstance:实例

//0:表示全局钩子

mHook=::SetWindowsHookEx (WH_KEYBOARD,KeyProc,hInstance,0);

return mHook!=NULL;

extern “C” __declspec(dllexport) void WINAPI Stop()

//要卸载的钩子

::UnhookWindowsHookEx (mHook);

5.在DLL.h中加入如下函数定义

extern “C” __declspec(dllexport) BOOL WINAPI Start();

extern “C” __declspec(dllexport) void WINAPI Stop();

编译生成HookDll.dll和HookDll.lib

Step 2:

1.新建MFC基本对话框应用程序,命名为HookTest,在其工作目录加入HookDll.dll和HookDll.lib

2.在CHookTestDlg.cpp中加入如下引用

//加入动态链接库的引用

#include “DLL.h”

//隐式调用库文件

#pragma comment(lib,”HookDLL”)

3.加入自定义消息

#define WM_Hook WM_USER+100

4.加入消息映射

BEGIN_MESSAGE_MAP(CHookTestDlg, CDialog) ON_MESSAGE(WM_Hook,OnReceive)  //增加部分END_MESSAGE_MAP()

5.在CHookTestDlg.h中加入消息声明

afx_msg void OnReceive(WPARAM wParam,LPARAM lParam);

6.在对话框另加入两个按钮btnStart,btnStop,相应的代码为:

void CHookTestDlg::OnbtnStartHook()

// TODO: Add your control notification handler code here

Start();

void CHookTestDlg::OnbtnStopHook()

// TODO: Add your control notification handler code here

Stop();

7.增加映射函数OnReceive的实现代码

void CHookTestDlg::OnReceive (WPARAM wParam,LPARAM lParam){  CEdit * mEdit=(CEdit *)GetDlgItem(IDC_EDIT1); mEdit->SetWindowText ((LPCSTR)lParam); }

Step 3:

运行程序,点btnStart,按键盘上任意键如A,,将弹出一对话框,并且文本显示回传的A

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128525.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 复合主键与联合主键[通俗易懂]

    复合主键与联合主键[通俗易懂]一、复合主键 所谓的复合主键就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。比如 createtabletest(namevarchar(19),idnumber,valuevarchar(10),primarykey(name,id))上面的name和id字段组合起来就是你

  • java json数组转json对象_json对象数组

    java json数组转json对象_json对象数组js数组、对象转json以及json转数组、对象1、JS对象转JSON方式:JSON.stringify(obj)varjson={“name”:”iphone”,”price”:666};//创建对象;varjsonStr=JSON.stringify(json);//转为JSON字符串console.log(jsonStr);  2、JS数组转JSON//数组转json串vararr=[1,2,3,{a:1}];JSON.stri

  • eruka处理应用服务器集群,Spring Cloud学习笔记——Eureka Server服务搭建及集群部署…

    eruka处理应用服务器集群,Spring Cloud学习笔记——Eureka Server服务搭建及集群部署…SpringCloud学习笔记——EurekaServerSpringCloud版本:Hoxton.SR3Springboot版本:2.2.5.RELEASEdemoGit仓库:开源在gitee中,私信索取地址服务治理在微服务架构中,服务治理是一个核心的内容。SpringCloud中,有许多的组件帮助完成服务治理。服务治理,可能包含以下一内容,如:服务注册与发现:服务的注册与发现,是微…

  • linux宝塔卸载,宝塔面板卸载与安装[通俗易懂]

    linux宝塔卸载,宝塔面板卸载与安装[通俗易懂]一键卸载宝塔Linux面板及运行环境命令1-使用xshell链接服务进入服务器命令:wgethttp://download.bt.cn/install/bt-uninstall.sh2-执行脚本命令:shbt-uninstall.sh3-根据提示4-完成更多功能及文档2,安装宝塔面板执行以下代码进行安装宝塔6.9免费版。宝塔6.9版本已经很稳定了,推荐大家直接安装6.9版本(注意:…

  • 多因子权重优化方法比较研究_权重因子是什么意思

    多因子权重优化方法比较研究_权重因子是什么意思https://www.ricequant.com/community/topic/4559在多因子量化投资体系中,具有稳定的预期收益,可解释的经济驱动理论,与其他因子的低相关性是选择alpha因子的关键指标。本篇文章中,我们以此为因子选取标准,简单地构建了自己的因子库,总共包括八个大类因子,每个大类因子中包含四到五个子类细分因子。为了比较不同的权重优化方法的优劣,本文首先采取不同的方法对各个大类…

  • 美化包软件_美化桌面的软件

    美化包软件_美化桌面的软件前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号