不得不说,C++写服务还是挺费劲的,在网上扒了一个服务的模子,我便开始写了,其实最主要的还是要实现服务中的死循环函数,代码逻辑和上述python的思路一起,区别就是我们需要使用C++的语法实现一遍而已。
POINT p; GetCursorPos(&p);//获取鼠标坐标 int x = p.x, y = p.y;//返回鼠标的坐标 time_t now_time = time(NULL); if (x == oldx && y == oldy) { int stay_seconds = int(now_time - prev_time); if (stay_seconds >= 6) { prev_time = now_time; SetCursorPos(x + 10, y + 10); SetCursorPos(x, y); WriteToLog("模拟一次鼠标移动"); mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0); WriteToLog("模拟鼠标单击"); keybd_event(\'esc\', 0, 0, 0); keybd_event(\'a\', 0, 0, 0); WriteToLog("模拟点击esc"); } } else { //更新旧坐标 最后一次移动鼠标时间 oldx = x; oldy = y; prev_time = now_time; }接下来的操作就是我们需要把写好的服务安装并启动
1. sc create test binPath= 可执行文件的路径 2. net start test 3. net stop test 4. net delete test执行上述步骤1和2即可启动服务
经过测试,太不幸了,GetCursorPos(&p)返回的坐标也为(0, 0),这下真是郁闷了,服务这条路难道真的走不通了吗?看到的大神有解决思路的还请在评论区支出,不胜感激。。。
b、C++可执行程序照搬照抄上述python服务转可执行程序的逻辑,我们把C++服务里的代码拿出来,放到 C++可执行程序中,我们也可以实现一个C++可执行程序
进过测试,以上python程序和C++程序都还有一些问题,在一些特定的窗口上模拟鼠标、键盘操作不好使,比如notepad ++、windows任务管理器等,系统在5分钟后还是锁屏,思前想后,觉着这个可能和程序权限有关系,随即把C++工程的属性进行了调整,生成的exe需要带有管理员权限,在次进行测试,结果是完美的,我们终于可以防止系统自动锁屏了,执行上述python的程序这里就不做权限升级研究了,有兴趣的同学自行研究
c++程序我们可以通过设置来吧程序设置成后台运行的,没有任何界面,这样显得更优雅一些,首先我们创建的是一个dos程序,设置设置两个地方即可
连接器->系统:子系统设置成窗口 (/SUBSYSTEM:WINDOWS)
连接器->高级:入口点设置成mainCRTStartup
三、优化最开始的模拟用户操作,我们使用的是点击鼠标左键、移动鼠标、和模拟点击esc按键,但是上述操作都会不懂程度的带来一些影响。
例如:
如果用户正在看视频,没有进行键鼠操作,这个时候如果点击鼠标左键,可能会导致视频暂停,不是用户期望的操作
如果用户打开了一个弹框,例如顶层窗口是一个esc快捷键可以关闭的程序,这个时候如果用户2分钟没有操作电脑,那么模拟的esc按键将会把用户的原始状态打乱
模拟操作优化过程
1、win+d切换到桌面,随即在开切换回来,这个操作相对来说比较靠谱,但是如果有一个窗口上有模态窗口存在,也会对打乱原始的窗口顺序
2、win键点击windows键,随即在点击一次,恢复到点击之前的状态,这个操作相对第一种还是比较友好的
3、切换大小写点击CapsLk按键,进行大小写切换,由于这个时候用户没有操作电脑,因此切换大小写不会对用户操作进行干扰,而且动静更小、更优雅
上述3中模拟操作行为基本思路都是一样的,只是模拟的方式所有不同,下边我们就以第三种方式讲解实现过程
点击CapsLk的操作分两部分,第一次主要是为了模拟用户点击,第二次是为了恢复第一次操作留下的痕迹,为了让程序更优雅的运行,我们这里需要启动子线程来恢复主线程留下的痕迹
main函数代码如下