使用 xlib 将假按键事件发送到 window
sending fake keypress event to a window using xlib
我正在尝试使用 C 和 xlib 将假按键事件发送到 window 并获得焦点,这是我的代码:
#include <X11/Xlib.h>
#include <X11/keysymdef.h>
#define XK_A 0x041
int main()
{
Display *display = XOpenDisplay(NULL);
//find out window with current focus:
Window winfocus;
int revert;
XGetInputFocus(display, &winfocus, &revert);
//send key event to taht window
KeySym sym;
sym=XStringToKeysym("a");
//event definition
XKeyEvent event;
event.type=KeyPress;
event.keycode=XK_A;
event.display=display;
event.root=winfocus;
XSendEvent(display,winfocus,True,KeyPressMask,(XEvent *)&event);
return 0;
}
我尽量保持代码简单,我想将字母 A 发送到活动 window
不过我觉得我做错了什么
谢谢
我尝试了以下代码:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
#include <unistd.h>
int main()
{
Display *dis;
dis = XOpenDisplay(NULL);
KeyCode modcode = 0; //init value
modcode = XKeysymToKeycode(dis, XK_B);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
sleep(1);
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
modcode = XKeysymToKeycode(dis, XK_A);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
return 0;
}
反复按a键,不使用休眠功能就放不开,打完字母就放不下
这看起来很像关于 Linux 问题的示例(没有答案):XLib problem (XSendEvent)
除了明显的(没有错误检查),也许看看其他人如何解决问题会给出一些提示:
- Sending fake keypress events to an X11 window 正在发送两个键 press/release 事件,以及关闭显示(而不是可能不发送事件)。
- XTestFakeKeyEvent and XSendEvent examples,类似.
- linEAK 中的
xsendkeycode.c
文件使用 XSync
清除事件。
我明白了。我不确定这是否是正确的方法,但它可以完成工作。按键前的按键释放修复了所有问题。
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
int main() {
Display *dis;
dis = XOpenDisplay(NULL);
KeyCode modcode = 0; //init value
int i;
for (i=0;i<5;i++) {
modcode = XKeysymToKeycode(dis, XStringToKeysym("a"));
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
sleep(1);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
}
return 0;
}
这将输入 5 个“a”。
我正在尝试使用 C 和 xlib 将假按键事件发送到 window 并获得焦点,这是我的代码:
#include <X11/Xlib.h>
#include <X11/keysymdef.h>
#define XK_A 0x041
int main()
{
Display *display = XOpenDisplay(NULL);
//find out window with current focus:
Window winfocus;
int revert;
XGetInputFocus(display, &winfocus, &revert);
//send key event to taht window
KeySym sym;
sym=XStringToKeysym("a");
//event definition
XKeyEvent event;
event.type=KeyPress;
event.keycode=XK_A;
event.display=display;
event.root=winfocus;
XSendEvent(display,winfocus,True,KeyPressMask,(XEvent *)&event);
return 0;
}
我尽量保持代码简单,我想将字母 A 发送到活动 window 不过我觉得我做错了什么
谢谢
我尝试了以下代码:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
#include <unistd.h>
int main()
{
Display *dis;
dis = XOpenDisplay(NULL);
KeyCode modcode = 0; //init value
modcode = XKeysymToKeycode(dis, XK_B);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
sleep(1);
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
modcode = XKeysymToKeycode(dis, XK_A);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
return 0;
}
反复按a键,不使用休眠功能就放不开,打完字母就放不下
这看起来很像关于 Linux 问题的示例(没有答案):XLib problem (XSendEvent)
除了明显的(没有错误检查),也许看看其他人如何解决问题会给出一些提示:
- Sending fake keypress events to an X11 window 正在发送两个键 press/release 事件,以及关闭显示(而不是可能不发送事件)。
- XTestFakeKeyEvent and XSendEvent examples,类似.
- linEAK 中的
xsendkeycode.c
文件使用XSync
清除事件。
我明白了。我不确定这是否是正确的方法,但它可以完成工作。按键前的按键释放修复了所有问题。
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
int main() {
Display *dis;
dis = XOpenDisplay(NULL);
KeyCode modcode = 0; //init value
int i;
for (i=0;i<5;i++) {
modcode = XKeysymToKeycode(dis, XStringToKeysym("a"));
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
sleep(1);
XTestFakeKeyEvent(dis, modcode, True, 0);
XFlush(dis);
XTestFakeKeyEvent(dis, modcode, False, 0);
XFlush(dis);
}
return 0;
}
这将输入 5 个“a”。