基于键盘钩子的dota改键(单线程+DLL)MFC实现(源码+总结)
呼。。终于可以摒弃网上带广告的改键工具了。。 历经三天,写出自己的dota改键软件最简单版了。 还学习了两个新知识,钩子和动态链接库。下面以一个新手的角度,总结下这三天遇到的大小问题。
一般钩子在什么时刻被调用?
操作系统把消息放进进程的消息队列后, 进程GetMessage()前。
钩子分类?
局部钩子:只能监视本进程内的线程。
远程钩子:远程钩子分为以下两种(两种一般都要DLL注入,极个别不用)
远程单线程钩子:监视单一线程。(魔兽改键。。 我用的就是这个~~)
全局钩子:监视所有线程。
钩子过程函数中,怎么样修改键值?
经测试,不可以修改健值。可能采取了副本复制之类的吧。可以keybd_event产生新消息,并屏蔽原消息。也可以用SendMessage...
貌似还可以用 WH_KEYBOARD_LL 来避免 DLL注入。。以后有心情再研究。备注下:
WH_KEYBOARD WH_KEYBOARD_LL 的区别?
WH_KEYBOARD的钩子过程在GetMessage或PeekMessage要取回一个键盘消息时调用,直接在被监视的线程中执行
WH_KEYBOARD_LL的钩子过程在一个键盘消息被投递到一个线程的消息队列之前调用,这个是向安装钩子的线程发送消息,让安装钩子的线程执行钩子过程,WH_KEYBOARD_LL必须是全局钩子,而且不需要在dll中
附上屏蔽组合键方法 WIN型 ALT型 与 CTRL 型
p = (PKBDLLHOOKSTRUCT) lParam;
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
fEatKeystroke =
// 屏蔽Win
(p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) ||
// 屏蔽Alt+Tab
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Alt+Esc
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Ctrl+Esc
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
break;
default:
break;
}
DLL源码 主要部分:
#include <windows.h>
//设置数据段为共享
#pragma data_seg(".wzy")
HHOOK g_hKeyboard=NULL;
static WORD g_KeyNumber[10]={0};
int g_lenth=0;
#pragma data_seg()
#pragma comment( linker,"/section:.wzy,RWS" )
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(code == HC_ACTION)
{
// 显血功能
if( wParam == VK_HOME && (((lParam>>31)&1) == 0) ) //按下HOME键
{
keybd_event(VK_OEM_4,0,0,0); //就一直按下 [ 键来显血
return 1;
}
if( wParam == VK_END && (((lParam>>31)&1) == 0) ) //按下END键
{
keybd_event(VK_OEM_4,0,KEYEVENTF_KEYUP,0); //就弹起 [ 键来 结束显血
return 1;
}
if( wParam == g_KeyNumber[0])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD7,0,0,0);
keybd_event(VK_NUMPAD7,0,KEYEVENTF_KEYUP,0);
return 1;
}
if( wParam == g_KeyNumber[1])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD8,0,0,0);
keybd_event(VK_NUMPAD8,0,KEYEVENTF_KEYUP,0);
return 1;
}
if( wParam == g_KeyNumber[2])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD4,0,0,0);
keybd_event(VK_NUMPAD4,0,KEYEVENTF_KEYUP,0);
return 1;
}
if( wParam == g_KeyNumber[3])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD5,0,0,0);
keybd_event(VK_NUMPAD5,0,KEYEVENTF_KEYUP,0);
return 1;
}
if( wParam == g_KeyNumber[4])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD1,0,0,0);
keybd_event(VK_NUMPAD1,0,KEYEVENTF_KEYUP,0);
return 1;
}
if( wParam == g_KeyNumber[5])
{
if( ((lParam>>31)&1) == 1) // 如果是弹起,忽略掉
return 1;
keybd_event(VK_NUMPAD2,0,0,0);
keybd_event(VK_NUMPAD2,0,KEYEVENTF_KEYUP,0);
return 1;
}
}
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}
_declspec(dllexport) void SetHook(HWND hwnd,WORD KeyNumber[],int lenth)
{
//参数先拷好。
for(int i=0;i<lenth;++i)
g_KeyNumber[i]=KeyNumber[i];
g_lenth = lenth;
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle("KeyboardProc.dll"),
GetWindowThreadProcessId( FindWindow("Warcraft III",0),NULL));
}
_declspec(dllexport) void DelHook(HWND hwnd)
{
UnhookWindowsHookEx(g_hKeyboard);
g_hKeyboard = NULL; //没卸载成功也强制弄成NULL
}
对话框部分,主要是一个定时器:
// 增加定时器 判断魔兽是否已经打开
void CChangeKeyDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{
if( m_bCheck == FALSE )
{
if( ::FindWindow("Warcraft III",0) )
{
m_bCheck = TRUE;
WORD modi;
UpdateData(TRUE);
m_Key7.GetHotKey( KeyNumber[0] , modi);
m_Key8.GetHotKey( KeyNumber[1] , modi);
m_Key4.GetHotKey( KeyNumber[2] , modi);
m_Key5.GetHotKey( KeyNumber[3] , modi);
m_Key1.GetHotKey( KeyNumber[4] , modi);
m_Key2.GetHotKey( KeyNumber[5] , modi);
MessageBox("目标进程开启了");
DelHook(m_hWnd);
SetHook(m_hWnd,KeyNumber,6); // 一发现目标进程,就安装钩子。
}
}
else
{
if( ::FindWindow("Warcraft III",0) == 0)
{
DelHook(m_hWnd);
m_bCheck = FALSE;
}
}
}
源码下载地址(DLL版):http://download.csdn.net/detail/a576323437/4613035
基于键盘钩子的dota改键(单线程+DLL)MFC实现(源码+总结)相关推荐
- 基于低级键盘钩子的dota改键(全局+免DLL注入)MFC实现(源码+总结)
上一篇文章已经写了基于 普通键盘钩子(单线程+DLL)来实现dota改键.http://blog.csdn.net/a576323437/article/details/8037138 这一次,基于 ...
- pb调用键盘钩子的例子_搞不动Vue3.0的源码,先做个API调用师也行(新人踩坑初试)...
作为一个刚刚入行工作不久的前端菜鸟,Vue2.x都没整熟练.但看着身边人都在学习Vue3,我也不敢怠慢,毕竟Vue3正式版已经发布两个月了,我还是耐着性子好好的阅读了一下Vue3.0的文档.没有其他大 ...
- 四足机器人|机器狗|仿生机器人|多足机器人|Adams仿真|Simulink仿真|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!
四足机器人|机器狗|仿生机器人|多足机器人|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!QQ:1096474659 基于CPG的四 ...
- 基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署
基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署 基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- asp毕业设计—— 基于asp+access的人事管理系统设计与实现(毕业论文+程序源码)——人事管理系统
基于asp+access的人事管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的人事管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...
- (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)
源码获取:我的博客资源页面可以下载!!!! 项目名称 (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发) 系统说明 随着信息技术的不断发展,我们已经 ...
- java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw
java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统 ...
- SSM框架基于h5的校园兼职招聘系统的设计与实现源码+论文三稿+ppt+查重报告(包远程安装,已降重)
项目名称 SSM框架基于h5的校园兼职招聘系统的设计与实现源码 视频效果 SSM框架基于h5的校园兼职招聘系统的设计与实现源码_哔哩哔哩_bilibili 项目地址 SSM框架基于h5的校园兼职招聘系 ...
- C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图
C++课程设计实训_基于多态书籍信息管理系统的设计与实现.附源码,有过程截图 书籍信息管理系统的设计与实现(基于多态) 学生姓名: 学 号: 指导老师: 所 在 系: 专 业: 班 级: C++课程设 ...
最新文章
- 春天来了,我也发“芽”了!
- nginx 访问控制 防盗链
- android 6.0谷歌,Android 6.0来了!谷歌月底要发布Android M系统
- windows winrar 指令_【转】winrar命令行详解
- 东南大学王萌 | “神经+符号”学习与多模态知识发现
- 第三章 表单与表单元素
- 使用ASP.NET 2.0 Profile存储用户信息
- matlab调用自己写的函数时报错: reference to a cleared variable
- Windows10/Servers 2016的TrustedInstaller权限获取(及乱改System后救砖
- LeedCode知识点之位运算
- 寻找大富翁(堆排序)
- 【存储测试】vdbench存储性能测试工具
- 电影推荐——基于关联分析Apriori算法
- 反安装冰盾抗DDOS防火墙后出现启动报错的解决方法
- html表格中间有空白,word文档表格中间出现空白怎么解决
- hdu5773 LIS+贪心
- ListView+Fragment实现导航栏
- 应对当今的医疗器械软件测试开发挑战,如何选择测试软件
- A5SHB,A5SHB芯片三极管规格书
- 语义网络 - 语义网络