C\C++真桌面贪吃蛇,桌面操控,有音乐音效“详解”

1. 桌面图标贪吃蛇!采用HOOK技术HOOK桌面,可以以桌面为焦点运行贪吃蛇。有背景音乐和音效,采用管道技术,实现音乐音效混响。
2. 试验环境,64位WIN10系统 VS2017调试。运行时,需要关闭图标的自动排序网格对齐,专业版系统需要右键以管理员身份运行。注入程序、子程序、DLL、音乐包需要同时放在桌面上。
(1)运行效果如下图:

(2)身体长了速度会变快,如下图:

(3)撞到自己会死,如下图:

(4)可以按后方向随时停止,撞到墙壁也会停止,如下图:

(5)按大键盘数字1键随时重新开始,如下图:

(6)按大键盘数字3键随时可以杀死音乐子进程,如下图:

3. 程序运行流程图如下

4. 要去掉DOS窗口,以桌面为焦点运行,需要HOOK桌面。桌面窗口是explorer.exe的子程序,所以我直接将DLL注入到了explorer.exe里面。
(1)注入程序采用的是远程线程注入(突破SESSION 0隔离机制),远程线程代码都是固定的,没什么技术含量。代码在末尾发链接。
(2)WIN10_X64系统中,注入程序、DLL需要是64位的程序,音乐子程序可以是32位的。
5. 代码功能讲解。
(0)提醒大家一下,现在写c++的代码,定义任何变量,一定要初始化,否则WIN10的检查机制总有不会放过你的时候。
(1)注意,游戏都在DLL文件里面,写游戏代码的时候最好先在EXE程序中调试好了以后,再放在DLL文件里面进行细微修改。否则很难调试。毕竟调试explorer.exe需要win10_x64的符号文件,我没有符号文件!调试不了。我用的是DbgView程序来测试错误的。 我用过钩子,但是技术不到家,钩不住桌面的键盘消息,所以我就改用了拦截窗口回调函数的方法。
(2)dll文件中的HOOK关键API一之:SetWindowLongPtr
 LONG_PTRWINAPISetWindowLongPtr(_In_ HWND hWnd,           //要更改的窗口的句柄_In_ int nIndex,          //索引_In_ LONG_PTR dwNewLong); //设置窗口回调函数/*这个函数是SetWindowLong进阶版,可以设置窗口回调,而且兼容64位和32系统,推荐用这个。用法如下  *///设置窗口回调 得到旧的窗口回调句柄g_OldProc = (WNDPROC)SetWindowLongPtr(g_hWin,       // 桌面窗口的句柄GWLP_WNDPROC, // 这个宏用于设置窗口回调(LONG_PTR)MyDefWindowProc //自己的窗口回调函数);
(3)关键API二之:DefWindowProc
LRESULTCALLBACKDefWindowProc(_In_ HWND hWnd,_In_ UINT Msg,      //消息_In_ WPARAM wParam, //消息类型_In_ LPARAM lParam);/*这是处理窗口默认的函数。我们使用的时候需要先定义,再重命名。如MyDefWindowProc重点需要关注的Msg 和wParam两个参数.Msg包含了如键盘消息,鼠标消息等wParam包含了改消息的具体操作    调用完这个函数后,记得在末尾加入CallWindowProc(g_OldProc, hWnd, Msg, wParam, lParam);这样就可以返回窗口原来的消息,我们也不会因此破坏原窗口的功能。*/// 截获键盘鼠标代码如下LRESULTCALLBACKMyDefWindowProc(_In_ HWND hWnd,_In_ UINT Msg,_In_ WPARAM wParam,_In_ LPARAM lParam){if (NULL != Msg){switch (Msg){case WM_MOUSEMOVE:OutputDebugString(L"移动了鼠标");break;case WM_LBUTTONDOWN:OutputDebugString(L"鼠标左键被点击");break;case WM_KEYDOWN:{OutputDebugString(L"按下了一个键");switch (wParam)   //接收方向控制蛇的移动{  case VK_UP:    key = 5; OutputDebugString(L"按了UP键");    break;case VK_DOWN:  key = 6; OutputDebugString(L"按了DOWN键");  break;case VK_LEFT:  key = 7; OutputDebugString(L"按了LEFT键");  break;case VK_RIGHT: key = 8; OutputDebugString(L"按了RIGHT键"); break;default:break;}}break;}}//CallWindowProc 调用指定窗口的回调函数return CallWindowProc(g_OldProc, hWnd, Msg, wParam, lParam);}
(4)我还利用PlaySound这个API设置了背景音乐,但是我发现第二次调用PlaySound实现第二个音效的时候,就会打断第一个音效,不论你怎么设置参数。 因为这个API内部实现的原理本身就是多线程的,所以即使我们创建一个或者十个新线程用这个函数,之前的音乐也会被打断。 所以只能创建一个新的进程进行混音。然而要让新进程准确无误的在某个时间点产生音乐,就需要一定的手段,在此我利用了管道通信。

DLL文件中的管道代码如下:

 //主程序调用,输入数字来设置BGMvoid SetBGM(int b){int bgm = b;_write(g_hpipe[1], &bgm, sizeof(int));}char hstr[20] = {};// 管道初始化setvbuf(stdout, NULL, _IONBF, 0);if (_pipe(g_hpipe, 256, O_BINARY) == -1)exit(1);// 数字转字符_itoa_s(g_hpipe[0], hstr, 10);char childExe[MAX_PATH] = {};// 子程序的全路径// 打开子程序_spawnl(P_NOWAIT, childExe, childExe, hstr, NULL);

子程序的管道代码如下:

int hpipe[2];int main(int argc, char* argv[])
{       // 隐藏DOS窗口ShowWindow(FindWindowA("ConsoleWindowClass", argv[0]), 0);int bgm = 0;hpipe[0] = atoi(argv[1]);// szDir,szDir1为要打开音乐的文件的全路径,或者相对路径while (true){if (_read(hpipe[0], &bgm, sizeof(int)))//d消息{switch (bgm){//子程序退出case -1:exit(0);//1号BGMcase 1:PlaySound(szDir, NULL, SND_FILENAME | SND_ASYNC); break;//2号BGMcase 2:PlaySound(szDir1, NULL, SND_FILENAME | SND_ASYNC); break;}}Sleep(100);//防止CPU占用过高}
}
(5)DLL代码中还是有些BUG ,我也懒得调了,毕竟DLL注入explorer.exe里面后,调试确实有点麻烦。
(6)我写了注入DLL代码,但是我没写卸载DLL的代码,如果需要重新调试explorer.exe程序,直接重启这个程序就行,如果不会重启的同学,那就是重启电脑重新调试吧,哈哈!
6. 代码和程序文件包下载链接:

https://download.csdn.net/download/qq_31507523/12824983
包里面的文件如下:

再说一遍,dll、注入程序、子程序、音乐包一定要放在桌面上,关闭图标自动排序和网格对齐 就可以直接管理员身份运行了。
我测试过两台WIN10,均能识别运行,WIN10_64的电脑应该没问题。至于WIN7电脑,需要修改代码重新生成程序了,其实修改的代码也就十来行,只需要修改查找桌面窗口句柄的那几行代码。
方向键是 UP、DOWN、LEFT、RIGHT 。也可以用W S A D 但是必须切换成英文输入法的状态

C\C++真桌面贪吃蛇,桌面操控,有音乐音效“详解”相关推荐

  1. c语言贪吃蛇打包到桌面,C语言实现桌面贪吃蛇小游戏

    本篇写的是桌面贪吃蛇小游戏,大家自己看吧,感谢大家的支持,谢谢!O(∩_∩)O~~ #define _CRT_SECURE_NO_WARNINGS #include #include #include ...

  2. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解

    网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Li ...

  3. 命令行贪吃蛇以及qt写的桌面贪吃蛇

    还记得大一上学期就想做贪吃蛇了,甚至写了三分之二,最后没有办法实现蛇的移动,就作废了,不知道是不是这个学期变聪明了,哈哈,一口气就写出来了,当然了,主要还是问了同学. 贪吃蛇主要有几个地方难实现,首先 ...

  4. 你真以为贪吃蛇是个简单的游戏?

    博客搬家:最爱午后红茶 诺基亚手机经典游戏,规则不多说~ 先上一个多年前火了一段时间的 gif 动态图以表达敬意: 听说这是一个俄罗斯人用程序实现的. 所以这里想谈一下 贪吃蛇如何才能把地图填满? 我 ...

  5. 北航数据结构与c语言2017答案,2022年北京航空航天大学991数据结构与C语言程序设计考研资料汇总:参考书目-历年考研真题-模拟题库-笔记和课后习题详解...

    北京航空航天大学软件学院官网网址: 991数据结构与C语言程序设计考研参考书目: 谭浩强<C程序设计>(第4版)笔记和课后习题详解 谭浩强<C程序设计>(第4版)精讲班[教材精 ...

  6. 网络技能大赛-2018年国赛真题[2018年全国职业技能大赛高职组计算机网络应用赛项真题-I卷]AC/AP/EG部分答案详解

    网络技能大赛-2018年国赛AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部分从之前的Debian又换回了CentOS,不过相应增加了U ...

  7. 向日葵远程控制桌面可以播放被控主机的声音-详解(亲测有效)

    受疫情影响,很多码农都在家远程办公,当然绝绝子也是其中一位呀     但是播放不了远程主机的声音.....emmmm~~查了很久的百度,都没有完全解决这个问题的方案!好在工夫不负有心人,我整理一下自己 ...

  8. 鸿蒙手机系统新桌面布局,鸿蒙系统是什么样的界面,详解华为鸿蒙系统

    鸿蒙OS是基于微内核的全场景分布式OS,这是分布式架构首次用于终端OS,可以实现跨终端无缝协同体验. 鸿蒙系统系统4大特点 据悉,"微内核"是鸿蒙OS的特点之一.即微内核采用同一套 ...

  9. 用C语言实现贪吃蛇笔记1-------.wav格式音乐的添加及播放(方法一:嵌入到可执行文件里面)

    下面的代码是将整个音乐移植到可执行文件里面,具体操作如下: #include <stdio.h> #include <stdlib.h> #include "reso ...

最新文章

  1. go1.8之安装配置
  2. 网络生成批量配置_GitHub Star 3.2K Java 图片缩略图生成库
  3. [转]Github 中被 Fork 最多的库
  4. Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法
  5. Linux学习之安装jdk
  6. solr6.0.0 + tomcat8 配置问题
  7. python web工资怎么样_月薪21170的Python Web岗,学到什么程度能找到工作?
  8. c语言知识竞赛题库答案,2021年9月全国计算机二级C语言考试真题及答案
  9. Android同步时出错,Android Studio中的Gradle给出错误项目同步失败
  10. 最好用的五个黑科技搜索引擎推荐
  11. Parallels Desktop 13 for Mac 中文正式版下载 – 优秀的虚拟机
  12. Wework的线上社交,能否支撑其169亿估值?
  13. 百度快速排名 24小时进前五 刷网站排名
  14. java计算时间差 (日时分秒)
  15. 淘宝商品详情(新版)
  16. 中国房价为什么会居高不下?
  17. 艾司博讯:拼多多批量发货怎么做?
  18. 笔记本电脑黑屏基础处理
  19. BAT再战二手车,哪种模式会胜出?
  20. dubbo下Dubbo协议注册中心理解SimpleRegistryService之register,getRegistered,notify方法理解注释

热门文章

  1. 3600万中国人在抖音“上清华”
  2. GTA圣安地列斯最全攻略
  3. NRF51822开发笔记-1.搭建NRF51822开发环境
  4. C# .NET 判断输入的字符串是否只包含数字和英文字母
  5. 电脑端应用软件自动化测试,自动化测试是什么?pc端的自动化测试框架有什么?...
  6. Python提取pdf中的表格数据(附实战案例)
  7. 网络相册管理系统java,基于JAVA的B/S网络相册管理系统,源码分享
  8. NRF52x开发环境搭建详解
  9. 汇编语言:定时器实现数码管0-99
  10. Mac版Office软件即将支持黑暗模式