linux窗口事件,在Linux / Ubuntu中捕獲窗口事件(屏幕捕獲+鼠標/鍵盤 - 事件)

Solution 1 I can recommend a piece of code for sending keyboard events which I use myself to simulate key presses. It is based on XSendEvent.

解決方案1我可以推薦一段用於發送鍵盤事件的代碼,我自己用它來模擬按鍵。它基於XSendEvent。

#include

#include

/** Modifier states */

#define MOD_ALT 0x8

#define MOD_CONTROL 0x4

#define MOD_CONTROL_ALT 0xc

#define MOD_SHIFT_CONTROL 0x5

#define MOD_SHIFT_ALT 0x9

XKeyEvent createKeyEvent(Display *display, Window &win,

Window &winRoot, bool press,

int keycode, int modifiers)

{

XKeyEvent event;

event.display = display;

event.window = win;

event.root = winRoot;

event.subwindow = None;

event.time = CurrentTime;

event.x = 1;

event.y = 1;

event.x_root = 1;

event.y_root = 1;

event.same_screen = True;

event.keycode = XKeysymToKeycode(display, keycode);

event.state = modifiers;

if(press)

event.type = KeyPress;

else

event.type = KeyRelease;

return event;

}

void pressKey(Display* display, Window &win_focus, Window &win_root,

KeySym key, int modifiers)

{

// Send a fake key press event to the window.

XKeyEvent event = createKeyEvent(display, win_focus, win_root, true, key, modifiers);

XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

// Send a fake key release event to the window.

event = createKeyEvent(display, win_focus, win_root, false, key, modifiers);

XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

}

Then, you can use it to send a key event (in this case Alt+W) as follows:

然后,您可以使用它來發送鍵事件(在本例中為Alt + W),如下所示:

// 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);

Solution 2 A similar behavior can be achieved using the XTest library. It operates on a "higher level" though and for instance the window manager will pick up those keypresses as well. The pressKey function for XTest can look like this (not very clean code):

解決方案2使用XTest庫可以實現類似的行為。它雖然在“更高級別”上運行,但是例如窗口管理器也會拾取這些按鍵。 XTest的pressKey函數看起來像這樣(不是很干凈的代碼):

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);

}

Solution 3 Another solution is to just script your way out with such tools as xdotool. Basically, most of what you described can be achieved with a bash script. Also xdotool source code is a great source of information on how to achieve all you want.

解決方案3另一種解決方案是使用xdotool等工具編寫出自己的出路。基本上,您所描述的大部分內容都可以通過bash腳本實現。此外,xdotool源代碼是如何實現所有目標的重要信息來源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值