最近在研究windows的鼠标自动控制程序,前面也写过一篇这方面的博客,今天又在基本控制的基础上加上了一些好玩的东西,那就是在画图软件中自动画图,是不是很炫酷。

基本思路是既然我们已经能控制鼠标的移动和点击了,那只要能打开画图软件,至少能在上面胡乱画些点和线。但是,乱画没什么意义啊,能不能画点有意思的东西呢?答案当然是肯定的了。既然画图那就画点好看的图片,好看的图片可以去百度下载,也可以是你朋友或者亲戚的照片,只要让我们的程序照着这张图片画不就ok了,图片的信息其实就是一些行列像素点,每个像素点由若干表示颜色的字节组成,以24位图为例,每个像素点包含3个字节,分别表示R、G、B,只要我们的程序能读取到这些信息,它就认识了这张图片,就可以照着图片画出相同的样子了。为了简单起见,我们先画黑白色调的图,这样就需要将图片进行二值化,二值化就是把每个像素点用0和1来表示,我采用的二值化算法是(R+G+B)/3的值小于128就取0,反之就取1。这样只要是0的点我们就把鼠标移动到相应的位置,然后点击就画出了一个点,而值为0的点无操作。这样一幅黑白照片就诞生了。

这里有几点注意事项,一是windows默认图片的行是4字节对齐的,对于不满足的行,会自动补充几个字节,而这几个字节是没有意义的,必须要过滤掉才能画出准确的图片,不然多几个点的图断行就会出现偏差,导致整张图片会有倾斜。我一开始就在这里栽了跟头,弄了好久才搞明白。二是画点的速度不能太快,太快了画图软件会反应不过来,他会错误得认为两次点击是一次点击,这样就会画出一条线,而不是我要的两个点,我的实验结果是两次画点间隔至少要2ms。

下面是读取图片并二值化得到一个维数组和图片宽和高的函数

int getMapArray(char *mapname, unsigned char *maparray, int* mapwidth, int* mapheight){int bytes = 3;//24位图BITMAPFILEHEADER fh;BITMAPINFOHEADER ih;int Row,Col;int i,j,k;int added;int index=0;FILE *f,*p;unsigned char *imagearray=(unsigned char*)calloc(6000*6000,sizeof(unsigned char));unsigned char *imagearray_tmp=(unsigned char*)calloc(6000*6000,sizeof(unsigned char));if((f=fopen(mapname,"rb"))==NULL){printf("open %s error,please check\n",mapname);return 0;}fread(&fh,sizeof(BITMAPFILEHEADER),1,f);if(fh.bfType!='MB'){printf("This is not a BMP picture, type is %s\n",fh.bfType);return 0;}fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);fread(&ih,sizeof(BITMAPINFOHEADER),1,f);mapheight[0]=Row=ih.biHeight;mapwidth[0]=Col=ih.biWidth;added = 4-(Col*bytes)%4;printf("added = %d\n",added);if(Row>2000||Col>2000){printf("BMP picture is too large, please cheese a small one, row=%d col=%d\n",Row,Col);return -1;}//每个像素点用3个字节表示(RGB),windows 会将图片的每一行4字节补齐,所以会多出一些字节,必须过滤掉这些字节fread(imagearray_tmp,sizeof(unsigned char),Row*(Col+1)*bytes,f);//过滤补齐的点for(i=0;i<Row*(Col*bytes+added);i++){for(j=0;j<added;j++){if(i%(Col*3+added)==Col*3+j) i++;}imagearray[index++] = imagearray_tmp[i];}//二值化int sum;index = 0;for(i=0;i<Row*(Col*bytes+added);i+=bytes){sum = 0;for(j=0;j<bytes;j++){sum+=imagearray[i+j];}if(sum/3<100)maparray[index++]=0;elsemaparray[index++]=1;}fclose(f);return 0;
}

主函数的功能就是调用上面的函数,得到图片信息,再调用move和click函数对鼠标进行操作画出图片,move和click函数在我的上一篇博客中已经贴出了代码,main函数代码如下:

int main(int argc,char *argv[]){int mapwidth[1];int mapheight[1];int i=0;int x=0;int y=0;int speed;//0:fast;1:namal;2:slowint tmp;char* mapname = argv[1];unsigned char* maparray=(unsigned char*)calloc(2000*2000,sizeof(unsigned char));if(argv[2]==NULL){speed=2;}else{tmp = atoi(argv[2]);if(tmp==1)speed=5;else if(tmp==2)speed=10;elsespeed=2;}getMapArray(mapname, maparray, mapwidth, mapheight);system("start /b C:/Windows/system32/mspaint.exe");int startx = (1920-mapwidth[0])/2;int starty = (1080+mapheight[0])/2;move(startx,starty);for(i=0;i<mapheight[0]*mapwidth[0];i++){if(maparray[i]==0){x = startx+i%mapwidth[0];y = starty-i/mapwidth[0];move(x,y);click(0,false);Sleep(speed);}}return 0;}
最后贴上成果

C语言控制鼠标自动画图相关推荐

  1. c语言鼠标可作用位置,用 C语言控制鼠标翻页,一共三页

    C语言鼠标操作方法及源码(转载)  鼠标的操作是使用dos中断功能,中断号:33h  下面给几个操作鼠标的示例,后面有更详细的中断功能说明及代码. 显示鼠标:  union REGS regs;  r ...

  2. C语言控制怪物自动走,一起用C语言打怪物

    //C语言多线程-主角和怪物 #include #include #define bool int //定义int变量为bool变量,bool不是真就是假 int a=0,b=20;//主角的坐标 i ...

  3. C语言控制和鼠标键盘 (windows环境)

    C语言控制鼠标点击以及键盘输入 使用场景 主要的几个函数介绍 实例 键盘输入对应值 使用场景 当需要实现一些重复的点击,或者自动输入的情况下,可以使用到类似的功能,例如网页的自动刷新,QQ的自动输入, ...

  4. 【Nodejs】使用robotjs控制鼠标键盘 自动点击屏幕上指定位置的图标 实现连接wifi等操作

    每天上班开机挺麻烦,要手动连wifi:因此可以写一个很简单的自动执行脚本,执行 node xxxxxx.js 安装 robotjs npm i robotjs -g xxxxxx.js 以下数字自行根 ...

  5. python自动控制库_一个可以自动化控制鼠标键盘的库:PyAUtoGUI

    PyAutoGUI 不知道你们有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 如果,我想半夜时候定时给发个微信,或者每天自动刷页面等操 ...

  6. python pywinauto 单击鼠标_Python释放你的双手去成就梦想之自动化控制鼠标键盘

    抖音上经常看到,魔兽玩家为了不掉线让女友一直帮忙按空格键,而我这条单身狗出去吃个饭就要继续排队几小时,无奈只能自力更生,下面让我向大家介绍下如何自动化控制鼠标键盘,让我们从重复无聊的工作中解放出来. ...

  7. python自动控制库_python PyAUtoGUI库实现自动化控制鼠标键盘

    PyAutoGUI 不知道你有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 比如,我想半夜时候定时给发个微信,或者每天自动刷页面等操作 ...

  8. 用语言控制Linux:Linux的语音识别软件

    开源语音识别软件simon的第一个测试版已经发布,simon用Julius作实际的语音识别处理引擎,HTK toolkit作为主要的语言模型.这些组件被一个易于使用的图形用户界面连接在一起.simon ...

  9. Python自动化控制鼠标和键盘操作—— PyAutoGUI

    简 介:PyAutoGUI是一个Python语言的键鼠自动化库,简单来说和按键精灵的功能一样.但是因为是Python的类库,所以可以使用Python代码配合一些其他类库完成更加强大的功能,本文对PyA ...

  10. python控制软件点击_Python小程序 控制鼠标循环点击代码实例

    Python小程序 控制鼠标循环点击代码实例 这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...

最新文章

  1. 2020年社招面试技巧总结!
  2. 深度学习与机器学习的思考
  3. 汇编指令 DUP指令
  4. bootstrap select多选
  5. 一次Oracle数据迁移
  6. Oracle数据库与Access互导实例
  7. maven 公共模块依赖_idea 创建多模块依赖Maven项目
  8. observable_Java Observable clearChanged()方法与示例
  9. pl sql入门比较好的书_面试官问你SQL?这几本书足够了
  10. 【LeetCode】461. Hamming Distance (java实现)
  11. 让天下没有难做的研发:解读阿里CI/CD、DevOps、分层自动化技术
  12. 模版,自定义按钮背景xml
  13. linux docker运行exe,如何在docker中运行windows
  14. 云服务器申请退款,腾讯云服务器申请自助退款的操作流程及图文教程
  15. Vue3 抽离封装axios
  16. 实践一:mipsel-栈溢出漏洞_开启telnet服务_反弹shell
  17. Python——程序设计方法学
  18. HTML5新特性(基本)
  19. C语言中 真值/原码/补码/反码 的概念
  20. JavaFast技术特点介绍-企业级JAVA快速开发平台, 内置java代码生成器

热门文章

  1. 什么是对象存储OSS,看完你就懂了
  2. 故障树分析法MATLAB,基于VC++与MATLAB的故障树分析系统
  3. 安卓手机各大应用市场APP审核遇到的坑
  4. Linux linux mb() / rmb() / wmb()
  5. Solidity函数中pure、view、constant的用法
  6. DB2 数据库的备份与还原
  7. 《剑来》语句摘录(四)
  8. am大学计算机科学,美国大学本科计算机科学专业排名一览
  9. excel随机数_软网推荐:Windows环境下快速生成随机数
  10. 双绞线的规范和制作经验谈