呼。。终于可以摒弃网上带广告的改键工具了。。 历经三天,写出自己的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实现(源码+总结)相关推荐

  1. 基于低级键盘钩子的dota改键(全局+免DLL注入)MFC实现(源码+总结)

    上一篇文章已经写了基于 普通键盘钩子(单线程+DLL)来实现dota改键.http://blog.csdn.net/a576323437/article/details/8037138 这一次,基于 ...

  2. pb调用键盘钩子的例子_搞不动Vue3.0的源码,先做个API调用师也行(新人踩坑初试)...

    作为一个刚刚入行工作不久的前端菜鸟,Vue2.x都没整熟练.但看着身边人都在学习Vue3,我也不敢怠慢,毕竟Vue3正式版已经发布两个月了,我还是耐着性子好好的阅读了一下Vue3.0的文档.没有其他大 ...

  3. 四足机器人|机器狗|仿生机器人|多足机器人|Adams仿真|Simulink仿真|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!

    四足机器人|机器狗|仿生机器人|多足机器人|基于CPG的四足机器人Simulink与Adams虚拟样机|源码可直接执行|绝对干货!需要资料及指导的可以联系我!QQ:1096474659 基于CPG的四 ...

  4. 基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署

    基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署 基于JAVA图书借阅系统的设计与实现计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  5. asp毕业设计—— 基于asp+access的人事管理系统设计与实现(毕业论文+程序源码)——人事管理系统

    基于asp+access的人事管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的人事管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  6. (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)

     源码获取:我的博客资源页面可以下载!!!! 项目名称 (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发) 系统说明 随着信息技术的不断发展,我们已经 ...

  7. java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统+数据库+lw java毕业设计基于Web生鲜O2O订购平台的设计与实现mybatis+源码+调试部署+系统 ...

  8. SSM框架基于h5的校园兼职招聘系统的设计与实现源码+论文三稿+ppt+查重报告(包远程安装,已降重)

    项目名称 SSM框架基于h5的校园兼职招聘系统的设计与实现源码 视频效果 SSM框架基于h5的校园兼职招聘系统的设计与实现源码_哔哩哔哩_bilibili 项目地址 SSM框架基于h5的校园兼职招聘系 ...

  9. C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图

    C++课程设计实训_基于多态书籍信息管理系统的设计与实现.附源码,有过程截图 书籍信息管理系统的设计与实现(基于多态) 学生姓名: 学 号: 指导老师: 所 在 系: 专 业: 班 级: C++课程设 ...

最新文章

  1. 春天来了,我也发“芽”了!
  2. nginx 访问控制 防盗链
  3. android 6.0谷歌,Android 6.0来了!谷歌月底要发布Android M系统
  4. windows winrar 指令_【转】winrar命令行详解
  5. 东南大学王萌 | “神经+符号”学习与多模态知识发现
  6. 第三章 表单与表单元素
  7. 使用ASP.NET 2.0 Profile存储用户信息
  8. matlab调用自己写的函数时报错: reference to a cleared variable
  9. Windows10/Servers 2016的TrustedInstaller权限获取(及乱改System后救砖
  10. LeedCode知识点之位运算
  11. 寻找大富翁(堆排序)
  12. 【存储测试】vdbench存储性能测试工具
  13. 电影推荐——基于关联分析Apriori算法
  14. 反安装冰盾抗DDOS防火墙后出现启动报错的解决方法
  15. html表格中间有空白,word文档表格中间出现空白怎么解决
  16. hdu5773 LIS+贪心
  17. ListView+Fragment实现导航栏
  18. 应对当今的医疗器械软件测试开发挑战,如何选择测试软件
  19. A5SHB,A5SHB芯片三极管规格书
  20. 语义网络 - 语义网络

热门文章

  1. vsftpd的配置详解
  2. ThingsBoard 开发环境搭建
  3. 适配2K和4K分辨率
  4. 写一篇文章(writing a paper)
  5. 岁月不饶人,09年是第一拨90后奔二的一年
  6. 2022年互联网行业薪酬趋势报告
  7. linux移动硬盘直接拔掉,安全弹出后就拔掉移动硬盘,真的安全吗?
  8. 仅改变rowspan背景_真实的他们《王者荣耀》全英雄历史故事以及设定背景介绍...
  9. python矩阵的共轭转置_基础 | Python 下的矩阵操作
  10. 寄东西怕快递丢件?往里扔个AirTag能追踪吗?