上个月就打算开发个还算好玩的项目,但是一直没时间。这篇是此项目用到的一部分,
处理好此部分基本还差通信等方面的了。首先模拟鼠标键盘按下释放的动作,本人利用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编程常用的几个头
文件:
AutoIt v3 版本, 这是一个使用类似 BASIC 脚本语言的免费软件, 它设计用于 Windows GUI(图形用户界面)中进行自动化操作. 利用模拟键盘按键, 鼠标移动和窗口/控件的组合来实现自动化任务. 而这是其它语言不可能做到或无可靠方法实现的(比如VBScript和SendKeys). AutoIt 非常小巧, 完全运行在所有windows操作系统上.(thesnow注:现在已经不再支持win 9x,微软连XP都能放弃, 何况一个win 9x支持), 并且不需要任何运行库. AutoIt
57
#include
#include
#include
本人用到的是#include
XTest.h有我们模拟鼠标和键盘需要的接口XTestFakeButtonEvent、 XTestFakeMotionEvent和
XTestFakeKeyEvent。想了解更多信息只需要在终端上man加函数名即可获得。
比如XTestFakeMotionEvent接口:
代码如下:
int XTestFakeMotionEvent(display, screen_number, x, y,delay);
Display *display; //此值就是从XOpenDisplay获得
int screen_number; //让其为-1即可表示当前的屏幕
int x, y; //屏幕位置
unsigned long delay; //延迟毫秒,让其为CurrentTime表示不延迟
最后我们要关闭Display句柄:XCloseDisplay(Display *display)。
接口实现如下:
代码如下:
#include
#include
#include
Display *dspopen(){
Display *dsp = XOpenDisplay(NULL);
if(!dsp) {
printf("open display failed\n");
return NULL;
}
return dsp;
}
int presskey(Display *dsp,int s){ //键盘按
if(dsp==NULL)
return -1;
// KeySym keysym=XStringToKeysym(s);
KeyCode key=XKeysymToKeycode(dsp,s);
if(key==NoSymbol)
return -1;
XTestFakeKeyEvent(dsp,key,1,CurrentTime);
XFlush(dsp);
return 0;
}
int move(Display *dsp,int x,int y) //鼠标移动
{
if(0==XTestFakeMotionEvent(dsp,-1,x,y,CurrentTime))
{
printf("Cannot move!\n");
return -1;
}
return 0;
}
int buttonpress(Display *dsp,int type) //鼠标按,type=1表示左键,3是右键,2是中键
{
if(0==XTestFakeButtonEvent(dsp,type,1,CurrentTime))
{
printf("press failed\n");
return -1;
}
return 0;
}
int buttonrelease(Display *dsp,int type) //鼠标释放
{
if(0==XTestFakeButtonEvent(dsp,type,0,CurrentTime))
{
printf("release failed\n");
return -1;
}
return 0;
}
int releasekey(Display *dsp,int s){ //键盘release
if(dsp==NULL)
return -1;
// KeySym keysym=XStringToKeysym(s);
KeyCode key=XKeysymToKeycode(dsp,s);
if(key==NoSymbol)
return -1;
XTestFakeKeyEvent(dsp,key,0,CurrentTime);
XFlush(dsp);
return 0;
}
void dspclose( Display *dsp ){
if(dsp!=NULL){
XCloseDisplay(dsp);
}
}
//int main(){ //测试用的会在程序结束后,在光标前输出c
// Display *dsp=dspopen();
// presskey(dsp,'c');
// releasekey(dsp,'c');
// dspclose(dsp);
// return 0;
/
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号