如何使用Xlib模拟拖动操作
How can I simulate a drag action using Xlib?
我有一个应用程序,它使用Xlib库来模拟屏幕上的鼠标。
我使用了XQueryPointer和XWarpPointer函数,我可以用它们模拟鼠标移动和点击。我的问题是我不能"拖动"一个元素(它是一个带有一些块的界面,你可以在用c++编写的Qt应用程序中移动这些块,并在Ubuntu上启动)。
我使用了这个摘录的许多部分:
发送X11点击事件对某些窗口不起作用
这个函数可以帮助我吗?
::XGrabPointer(mDisplay, window, True,
ButtonPressMask |
ButtonReleaseMask |
PointerMotionMask |
FocusChangeMask |
EnterWindowMask |
LeaveWindowMask,
GrabModeAsync,
GrabModeAsync,
RootWindow(mDisplay, DefaultScreen(mDisplay)),
None,
CurrentTime);
你知道吗?
提前感谢。
如果您同意生成子进程,则可以轻松地使用xdotool
,如下所示:
xdotool mousedown 1
sleep 0.5
xdotool mousemove_relative --sync 200 200
sleep 0.5
xdotool mouseup 1
http://www.semicomplete.com/projects/xdotool/http://tuxradar.com/content/xdotool-script-your-mouse xdotool
的源代码将作为一个很好的起点,如果你想在C中使用XTest
库自己做这个。
您可以通过向窗口发送XMotionEvent来实现这一点。X11知道它是一个拖动事件的方式是通过检查状态。所以,如果状态是OR与Button1Mask,那么这意味着当Button1被按下时,动作已经完成。
我在这里粘贴伪代码。您可能希望根据您的用例填充XMotionEvent的相关字段。
Display *OpenedDisplay = XOpenDisplay(NULL);
int ret = 0,screen = 0;
XMotionEvent xbpe;
Window dummy;
unsigned int mask,dummyUInt;
int dummyInt;
int screencount = ScreenCount(xbpe.display);
for (int i = 0; i < screencount; i++) {
Screen *screenPointer = ScreenOfDisplay(xbpe.display, i);
ret = XQueryPointer(xbpe.display, RootWindowOfScreen(screenPointer), &dummy, &dummy,
&dummyInt, &dummyInt, &dummyInt, &dummyInt, &mask);
if (ret == True) {
screen = i;
break;
}
}
xbpe.type = MotionNotify;
xbpe.display = OpenedDisplay;
xbpe.window = wid;
xbpe.root = RootWindow(xbpe.display, screen);
xbpe.subwindow = None;
xbpe.time = CurrentTime;
xbpe.x = src_x;
xbpe.y = src_y;
xbpe.state = mask;
xbpe.is_hint = NotifyNormal;
xbpe.same_screen = True; /* Should we detect if window is on the same screen as cursor? */
XWindowAttributes attr;
ret = XGetWindowAttributes(xbpe.display, wid, &attr);
if(ret == 0){
qDebug() << wid <<"XGetWindowAttributes unsuccessfull returning early";
return;
}
/**************************** This is key here *******************/
if(isDrag){
xbpe.state |= Button1Mask;
}
ret = XSendEvent(xbpe.display, wid, False, PointerMotionMask|ButtonMotionMask|MotionNotify, (XEvent *)&xbpe);
XFlush(OpenedDisplay);
XCloseDisplay(OpenedDisplay);
我建议使用xdotool的源代码。它没有具体地涵盖您的问题,但提供了关于填充X*Event字段的足够信息。
相关文章:
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何在鼠标挂钩过程中检测拖动
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 如何防止特定的QTreeView分支被拖动?
- 通过拖动边框调整大小时不显示SDL_WINDOWEVENT_SIZE_CHANGED?
- 在 qt 中的绘图中拖动误差线
- 非拖动功能模板参数包的合法使用
- QML在被Mousearea拖动时无法更改项目位置
- 在OpenGL中,如何将鼠标跟随更改为鼠标单击,拖动并移动释放?
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- 图形项目的QgraphicsScene中的可拖动像素
- Qt - 防止在拖动标题栏时调整窗口大小
- 在内部使用ComboBox拖动ListWidget项目
- 使用C 绘制矩形拖动
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- 如何在QT中拖动未装饰的窗口
- 有没有办法在Qt中以编程方式中断鼠标拖动
- Qt - 拖动移动 q图形项不能很好地工作
- 如何跟踪拖动/下降操作的寿命
- 如何使用Xlib模拟拖动操作