Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用xlib向窗口发送假按键事件_C_Linux_Xlib - Fatal编程技术网

C 使用xlib向窗口发送假按键事件

C 使用xlib向窗口发送假按键事件,c,linux,xlib,C,Linux,Xlib,我正在尝试使用C和xlib向具有焦点的窗口发送假按键事件,以下是我的代码: #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

我正在尝试使用C和xlib向具有焦点的窗口发送假按键事件,以下是我的代码:

#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;
}
#包括
#包括
#定义XK_A 0x041
int main()
{
Display*Display=XOpenDisplay(空);
//查找具有当前焦点的窗口:
窗口winfocus;
int还原;
XGetInputFocus(显示,&winfocus,&revert);
//将密钥事件发送到taht窗口
键符号;
sym=XStringToKeysym(“a”);
//事件定义
XKeyEvent事件;
事件类型=按键;
event.keycode=XK_A;
事件显示=显示;
event.root=winfocus;
XSendEvent(显示、winfocus、True、按键掩码、(XEvent*)和事件);
返回0;
}
我试图使代码尽可能简单,我想将字母A发送到活动窗口 不过我觉得我做错了什么

谢谢


我尝试了以下代码:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
显示*dis;
dis=XOpenDisplay(空);
KeyCode modcode=0;//初始值
modcode=XKeysymToKeycode(dis,XK_B);
XTestFakeKeyEvent(dis,modcode,True,0);
XFlush(dis);
睡眠(1);
XTestFakeKeyEvent(dis,modcode,False,0);
XFlush(dis);
modcode=XKeysymToKeycode(dis,XK_A);
XTestFakeKeyEvent(dis,modcode,True,0);
XFlush(dis);
返回0;
}

它反复按a键,如果我不使用睡眠功能,我无法释放该按钮,我无法一次键入字母,然后释放按键,这很像Linux问题上的一个示例(没有答案):

除了显而易见的(无错误检查)之外,或许看看其他人是如何解决问题的,也会给出一些提示:

  • 正在发送按键/释放事件,以及关闭显示器(而不是可能不发送事件)
  • ,是相似的
  • 中的
    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;
      }
      
      #包括
      #包括
      #包括
      #包括
      int main(){
      显示*dis;
      dis=XOpenDisplay(空);
      KeyCode modcode=0;//初始值
      int i;
      
      对于(i=0;i)正在使用
      hello
      吗?感谢链接到linEAK和
      XSync
      提示。它可以工作。其他链接无效。