上个月就打算开发个还算好玩的项目,但是一直没时间。这篇是此项目用到的一部分,

处理好此部分基本还差通信等方面的了。首先模拟鼠标键盘按下释放的动作,本人利用X11

这个库,所以要了解X11编程;其次,本身用c或者c++就可以实现了,但是由于本人是py

粉,所以总想把代码搬进python,所以本人就要实现python模块,本篇用的ctypes,以后会

把python的c扩展模块附上来的。

1.X11编程

首先简单的介绍一下X11吧,网上有介绍,本人就不重复了。我们知道X是以server与client

的方式提供服务的,我们想要使用其功能,我们就需要与server通信。使用

Display *XOpenDisplay(char *display_name)获得一个Display类型的句柄指针就可以了。

display_name可以是DISPLAY环境变量,用echo $DISPLAY输出是:0(这是本人linux mint输

出的)。如果display_name为NULL接口默认使用环境变量保存的值。X11编程常用的几个头

文件:

#include

#include

#include

本人用到的是#include 和#include .

XTest.h有我们模拟鼠标和键盘需要的接口XTestFakeButtonEvent、 XTestFakeMotionEvent和

XTestFakeKeyEvent。想了解更多信息只需要在终端上man加函数名即可获得。

比如XTestFakeMotionEvent接口:

intXTestFakeMotionEvent(display, screen_number, x, y,delay);

Display*display; //此值就是从XOpenDisplay获得intscreen_number; //让其为-1即可表示当前的屏幕intx, y; //屏幕位置

unsignedlong delay; //延迟毫秒,让其为CurrentTime表示不延迟

最后我们要关闭Display句柄:XCloseDisplay(Display *display)。

接口实现如下:

1 #include

2 #include

3 #include

4 Display *dspopen(){5

6 Display *dsp =XOpenDisplay(NULL);7 if(!dsp) {8 printf("open display failed\n");9 returnNULL;10 }11 returndsp;12 }13 int presskey(Display *dsp,ints){ //键盘按14 if(dsp==NULL)15 return -1;16 //KeySym keysym=XStringToKeysym(s);

17 KeyCode key=XKeysymToKeycode(dsp,s);18 if(key==NoSymbol)19 return -1;20 XTestFakeKeyEvent(dsp,key,1,CurrentTime);21 XFlush(dsp);22 return 0;23 }24 int move(Display *dsp,int x,inty) //鼠标移动25 {26 if(0==XTestFakeMotionEvent(dsp,-1,x,y,CurrentTime))27 {28 printf("Cannot move!\n");29 return -1;30 }31 return 0;32 }33 int buttonpress(Display *dsp,inttype) //鼠标按,type=1表示左键,3是右键,2是中键34 {35 if(0==XTestFakeButtonEvent(dsp,type,1,CurrentTime))36 {37 printf("press failed\n");38 return -1;39 }40 return 0;41 }42 int buttonrelease(Display *dsp,inttype) //鼠标释放43 {44 if(0==XTestFakeButtonEvent(dsp,type,0,CurrentTime))45 {46 printf("release failed\n");47 return -1;48 }49 return 0;50 }51 int releasekey(Display *dsp,ints){ //键盘release52 if(dsp==NULL)53 return -1;54 //KeySym keysym=XStringToKeysym(s);

55 KeyCode key=XKeysymToKeycode(dsp,s);56 if(key==NoSymbol)57 return -1;58 XTestFakeKeyEvent(dsp,key,0,CurrentTime);59 XFlush(dsp);60 return 0;61 }62 void dspclose( Display *dsp ){63 if(dsp!=NULL){64 XCloseDisplay(dsp);65

66 }67 }68 //int main(){ //测试用的会在程序结束后,在光标前输出c69 //Display *dsp=dspopen();70 //presskey(dsp,'c');71 //releasekey(dsp,'c');72 //dspclose(dsp);73 //return 0;74 //}

上面注释掉的main函数可以作为测试用的,好了,我们把上面的代码保存为display.c

编译成一个共享库,需要X11和Xtst库。

gcc -fPIC -shared -o libdisplay.so display.c -lX11 -lXtst

编译后会生成libdisplay.so 。现在我们ctypes模块使用这个动态共享库。

2.ctypes简单介绍和使用

我们知道python中的类型与c中类型是不一样的,应该说没有一样的,就拿int想来说,

python也是把它看作PyObject类型来处理的。那么我们需要使用ctype提供的接口做类型的

此链接有张图详细的展现类型转换对应的接口。下面演示具体的操作吧。

我们通过CDLL()接口载入库:

lc=CDLL("./libdisplay.so")

然后就可以使用库中提供的接口了,但是上面dspopen()接口的返回值是Display类型的指针,

所以我们需要用c_void_p()转换一下:

d=c_void_p(lc.dspopen())

之后就可以用d做处理了,代码如下:

from ctypes import *import timeclassMOUSE:

LEFT=1MiDDLE=2RIGHT=3lc=CDLL("./libdisplay.so")

d=c_void_p(lc.dspopen())

time.sleep(5);

lc.buttonpress(d,c_int(MOUSE.RIGHT))

lc.buttonrelease(d,c_int(MOUSE.RIGHT))

lc.dspclose(d)

上面的代码会在5秒后在鼠标指针处打开右键菜单。

利用ctypes使用c编写的库就讲这么多吧。以后会把c代码的部分写成python的c扩展再分享吧。

利用上面的模拟键盘和鼠标的接口可以做一些有意思的事情....

python 模拟鼠标键盘_python之模拟鼠标键盘动作相关推荐

  1. python 模拟键盘_python+selenium模拟键盘输入

    from selenium.webdriver.common.keys import Keys #键盘导入类 --------------------------------------------- ...

  2. python计算器gui设计_python GUI模拟实现计算器

    python编写计算器,供大家参考,具体内容如下 (1)计算器界面如下: (2)基本满足了计算器的所有需求,使用时不可键盘输入,只能鼠标点击左键才可执行.初始时显示0.0,每次输入的内容存于D:\nu ...

  3. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

  4. python调用键盘_Python直接控制鼠标键盘

    Python直接控制鼠标键盘 之前因为期末的原因已经很久没写博客了,今天博主发现一个好玩的模块PyAutoGUI,借助它可以使用Python脚本直接控制键盘鼠标,感觉可以解决很多无聊的机械运动.这里记 ...

  5. python如何控制鼠标键盘_Python如何控制鼠标键盘

    Python如何控制鼠标键盘 发布时间:2020-12-15 09:14:59 来源:亿速云 阅读:88 作者:小新 这篇文章将为大家详细讲解有关Python如何控制鼠标键盘,小编觉得挺实用的,因此分 ...

  6. python 网站发送验证码_Python爬虫模拟登录带验证码网站

    爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 首先得明白cookie的作用, ...

  7. python怎么模拟浏览器交互_python+webdriver 模拟用户交互工具

    概述: 使用webdriver(引用摘抄于"Python模拟登陆万能法-微博|知乎" 使用selenium库 步骤: 安装webdriver: Windows: pc:chrome ...

  8. python爬虫登录微博_python爬虫-模拟微博登录

    微博模拟登录 这是本次爬取的网址:https://weibo.com/ 一.请求分析 找到登录的位置,填写用户名密码进行登录操作 看看这次请求响应的数据是什么 这是响应得到的数据,保存下来 exect ...

  9. python爬虫登录微博_python爬虫-模拟微博登录功能

    微博模拟登录 这是本次爬取的网址:https://weibo.com/ 一.请求分析 找到登录的位置,填写用户名密码进行登录操作 看看这次请求响应的数据是什么 这是响应得到的数据,保存下来 exect ...

最新文章

  1. wan886网址导航 Bo9bo高清电影 两个图标 怎么都删不掉
  2. [TypeScript][文档]变量
  3. Spring3 文件上传
  4. 1190 最小公倍数之和 V2
  5. gridview中的图片错乱解决办法
  6. java quickhit项目_【QuickHit项目实例】
  7. Openresty 学习笔记(三)扩展库之neturl
  8. VEGAS不等双11,提前嗨购!助你成为视频大神!
  9. Get Intellisense for .axml files in Visual Studio
  10. Process finished with exit code 1
  11. android绘图软件推荐,动漫绘画辅助软件有哪些-7款绘画软件推荐
  12. 蜂鸣器c51汇编语言,51单片机蜂鸣器奏乐实验汇编代码.doc
  13. 程序员代码面试指南读书笔记1
  14. 论文阅读SG-PBFT: a Secure and Highly Efficient Blockchain PBFT Consensus Algorithm for IoV
  15. 什么样的域名是一级域名?和二级域名有什么关系?
  16. 药物组合疗法的机器学习方法(综述类)
  17. Sentinel控制台搭建使用
  18. 12 HotKey问题
  19. 用matplotlib中的FuncAnimation()实现GDP世界排名动态图
  20. 【定位原理揭秘第三期】室内定位技术原理揭秘

热门文章

  1. HDU1599 find the mincost route Floyd算法求最小环
  2. 洛谷2015 二叉苹果树 树形DP
  3. 小微商 获取平台证书 报错
  4. mysql当数据改变时_MySQL中,当update修改数据与原数据相同时会再次执行吗?
  5. Docker操作容器2
  6. Elasticsearch系列「二」如何物理删除给定期限的历史数据?
  7. AJAX——注册新用户的重名提示
  8. PHP扩展——IIS下开启PHP扩展失败解决方案
  9. Molly's Chemicals
  10. CG CTF WEB AAencode