在Linux / Ubuntu中捕获窗口事件(屏幕捕获+鼠标/键盘 - 事件)

时间:2015-05-07 19:32:56

标签: c++ linux keyboard mouse capture

我想在Linux的C ++中开发一个需要通过标准IO(鼠标+键盘)与其他程序交互的应用程序。它应该能够将鼠标/键盘输入发送到窗口并捕获"屏幕截图"那个特定的窗口。

(1)现在我做了一些研究,我知道Linux使用" X Window" -System。建议从这一层开始编程,还是应该使用更高级别的框架(例如wxWidgets)?

(2)是否可以将输入事件发送到/捕获窗口的屏幕,即使它没有被聚焦?

(3)我不是要求您提供代码,但我希望能够通过一些关于该主题的文献。可悲的是,我无法找到关于这个主题的任何好消息来源。

如果有人可以帮助我,那就太好了!

先谢谢你!!

[注意:此程序应作为后端运行,稍后从java应用程序执行命令。计划是单独实现这个后端C ++ App for Windows / Linux]

1 个答案:

答案 0 :(得分:0)

解决方案1 ​​我可以推荐一段用于发送键盘事件的代码,我自己用来模拟按键操作。它基于XSendEvent。

// Obtain the X11 display.
Display *display = XOpenDisplay(0);
if (display == NULL)
{
  printf("Null display!\n");
  return 1;
}

// Get the root window for the current display
Window win_root = XDefaultRootWindow(display);

// Find the window which has the current keyboard focus
Window win_focus;
int    revert;
XGetInputFocus(display, &win_focus, &revert);


pressKey(display, win_focus, win_root, XK_w, MOD_ALT);

if (display)
  XCloseDisplay(display);

然后,您可以使用它发送一个键事件(在本例中为Alt + W),如下所示:

void pressKey(Display* display, KeySym modifier1, KeySym modifier2, KeySym key)
{
    // Release every other modifier
    KeyCode keycodec = XKeysymToKeycode(display, XK_Control_L);
    KeyCode keycodea = XKeysymToKeycode(display, XK_Alt_L);
    KeyCode keycodes = XKeysymToKeycode(display, XK_Shift_L);
    XTestFakeKeyEvent(display, keycodec, False, 0); // key release event
    XTestFakeKeyEvent(display, keycodea, False, 0); // key release event
    XTestFakeKeyEvent(display, keycodes, False, 0); // key release event
    XFlush(display);

    // Press the actual keys
    KeyCode keycode1 = XKeysymToKeycode(display, modifier1);
    KeyCode keycode2 = XKeysymToKeycode(display, modifier2);
    KeyCode keycode3 = XKeysymToKeycode(display, key);
    if (keycode1)
        XTestFakeKeyEvent(display, keycode1, True, 0); // key press event
    if (keycode2)
        XTestFakeKeyEvent(display, keycode2, True, 0); // key press event
    if (keycode3)
    {
        XTestFakeKeyEvent(display, keycode3, True, 0); // key press event
        XTestFakeKeyEvent(display, keycode3, False, 0); // key release event
    }
    if (keycode2)
        XTestFakeKeyEvent(display, keycode2, False, 0); // key release event
    if (keycode1)
        XTestFakeKeyEvent(display, keycode1, False, 0); // key release event
    XFlush(display);
}

解决方案2 使用XTest库可以实现类似的行为。它运行在更高的水平"但是,例如窗口管理器也将拾取这些按键。 XTest的pressKey函数看起来像这样(不是很干净的代码):

gcc whatever.c sample.c -o sample

解决方案3 另一种解决方案是使用xdotool等工具编写出自己的出路。基本上,您所描述的大部分内容都可以通过bash脚本实现。此外,xdotool source code是如何实现所有目标的重要信息来源。