本文开发环境配置:
依赖的库/文件 | deb系 | rpm系 |
---|---|---|
gdk-2.0 | apt install libgtk2.0-dev | yum install gtk2-devel |
gdk-3.0 | apt install libgtk-3-dev | yum install gtk3-devel |
x11/Xlib.h | apt install libx11-dev | yum install libX11-devel |
X11/extensions/XTest.h | apt install libxtst-dev | yum install libXtst-devel |
- 本文中使用的gdk代码在编译时如果提示’undefined reference’,则表示您的系统中gtk2 / gtk3的版本已经将该API丢弃,此时建议您自己再查阅
/usr/include/gtk-2.0/gdk
或/usr/include/gtk-3.0/gdk
下相关的头文件。
1、gtk/gdk 2.0获取linux下鼠标的全局坐标
//返回参数得到的是鼠标的横纵坐标
void getMousePosition(int *mouseX,int *mouseY){
GdkDisplay *display;
GdkScreen *screen;
GdkWindow *window;
gdk_init(NULL,NULL);//gdk代码必须使用该函数初始化gdk环境
display = gdk_display_get_default();//获取默认的GdkDisplay
screen = gdk_display_get_default_screen(display);//获取默认GdkDisplay对应的默认GdkScreen
window = gdk_screen_get_root_window(screen);//获取GdkScreen对应的GdkWindow
gdk_window_get_pointer(window,mouseX,mouseY,0);//根据全局GdkWindow获取鼠标位置
}
2、gtk/gdk 3.0获取linux下鼠标的全局坐标
//参数分别是mouse的横纵坐标
void getMousePosition(int *mouseX,int *mouseY){
GdkDisplay* ddpy;
GdkDeviceManager* device_manager;
GdkDevice* pointer;
gdk_init(NULL,NULL);//使用gdk时必须要gdk_init()
ddpy = gdk_display_get_default(); //获取默认的GdkDisplay
device_manager = gdk_display_get_device_manager(ddpy);//获取gdk设备管理器
pointer = gdk_device_manager_get_client_pointer(device_manager);//获取gdk表示的鼠标设备
gdk_device_get_position(pointer,NULL,mouseX,mouseY);//获取鼠标设备的全局坐标
}
3、x11/xlib 获取linux全局鼠标位置
void getMousePosition(int* mouseX,int* mouseY){
Display* dpy;
XEvent e;
dpy = XOpenDisplay(NULL);/*获取默认的x11 Display*/
//关注全局鼠标点击事件,注意该函数必须调用,否则XNextEvent()无法捕获到鼠标点击事件
XGrabPointer(dpy,
DefaultRootWindow(dpy),
1,
PointerMotionMask | ButtonPressMask | ButtonReleaseMask ,/*依次表示鼠标的移动、按下、抬起事件掩码*/
GrabModeAsync,
GrabModeAsync,
None,
None,
CurrentTime);/*CurrentTime == 0,是宏定义*/
while(1){
//使用如下事件模拟鼠标点击事件
XTestFakeButtonEvent(dpy,1,1,CurrentTime);//鼠标按下Press
XTestFakeButtonEvent(dpy,1,0,CurrentTime);//鼠标抬起Release
//XNextEvent()会阻塞等待事件产生
XNextEvent(dpy,&e);
if(e.type == ButtonPress){/*监测到鼠标点击事件*/
*mouseX = e.xmotion.x_root;
*mouseY = e.xmotion.y_root;
break;/*监测到点击后,记录鼠标坐标,便立即退出while循环*/
}
}
XCloseDisplay(dpy);/*关闭x11 Display*/
}
4、代码测试
- gtk/gdk代码测试(2.0 与3.0测试代码通用,只是getMousePosition()内部不同)
#include <stdio.h>
#include <gdk/gdk.h>
#include <unistd.h>
void getMousePosition(int *mouseX,int *mouseY);
int main(int argc,char* argv[]){
int mouseX,mouseY;
getMousePosition(&mouseX,&mouseY);
printf("x=%d y=%d\n",mouseX,mouseY);
return 0;
}
gtk-2.0 编译: gcc mouse-20.c -o mouse-20 `pkg-config --cflags --libs gtk+-2.0`
gtk-3.0 编译:gcc mouse-30.c -o mouse-30 `pkg-config --cflags --libs gtk+-3.0`
2)x11代码测试
/* 使用XTestFakeButtonEvent()模拟鼠标点击事件
* 激活XNextEvent(),捕获到鼠标点击事件后打印鼠标的位置
*/
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <stdio.h>
void getMousePosition(int* mouseX,int* mouseY);
int main(){
int x,y;
getMousePosition(&x,&y);
printf("x=%d y=%d\n",x,y);
return 0;
}
编译: gcc test.c -o test `pkg-config --cflags --libs x11 xtst`
或者: gcc test.c -o test -lX11 -lXtst