Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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 X11等待并获取剪贴板文本_C_X11 - Fatal编程技术网

C X11等待并获取剪贴板文本

C X11等待并获取剪贴板文本,c,x11,C,X11,我必须监视X11剪贴板 目前,我每5秒请求一次剪贴板选择,然后对从剪贴板返回的文本进行散列,并将其与上次检查时计算的散列值进行比较。如果散列不一样,我分析文本内容并做一些事情 我不喜欢我的方法。我来自Windows,使用winapi,当剪贴板发生更改时,内核会通知您的程序,而且效率更高 我只是想知道,当剪贴板发生更改时,X11是否可能以winapi的形式通知您的程序?使用X11检查剪贴板修改的更有效方法是什么?这里有一个很好的参考:这里有一个很好的参考: 使用GetSelectionOwner(

我必须监视X11剪贴板

目前,我每5秒请求一次剪贴板选择,然后对从剪贴板返回的文本进行散列,并将其与上次检查时计算的散列值进行比较。如果散列不一样,我分析文本内容并做一些事情

我不喜欢我的方法。我来自Windows,使用winapi,当剪贴板发生更改时,内核会通知您的程序,而且效率更高

我只是想知道,当剪贴板发生更改时,X11是否可能以winapi的形式通知您的程序?使用X11检查剪贴板修改的更有效方法是什么?

这里有一个很好的参考:

这里有一个很好的参考:

  • 使用
    GetSelectionOwner
    (主窗口和剪贴板)查找包含所选内容的窗口
  • 通过发送SelectionRequest获取选择副本,通知您的应用程序
  • 观察
    选择清除
    事件
  • 使用
    SelectionClear
    事件中的id更新窗口,转到步骤2
  • 使用
    GetSelectionOwner
    (主窗口和剪贴板)查找包含所选内容的窗口
  • 通过发送SelectionRequest获取选择副本,通知您的应用程序
  • 观察
    选择清除
    事件
  • 使用
    SelectionClear
    事件中的id更新窗口,转到步骤2

  • Xfixes扩展中使用
    xfixeselectionput()
    并等待
    xfixeselectionnotify
    事件

    例如:

    //gcc-o xclipwatch xclipwatch.c-lX11-lX11
    ...
    #包括
    ...
    无效观察选择(显示*显示,窗口,常量字符*bufname)
    {
    int事件库、错误库;
    XEvent事件;
    Atom bufid=XInternAtom(显示,bufname,False);
    断言(XFixesQueryExtension(显示、事件库和错误库));
    xFixesseSelectionInput(显示、DefaultRootWindow(显示)、bufid、xFixessesSelectionOwnerNotifyMask);
    while(True)
    {
    XNextEvent(显示和事件);
    if(event.type==event_base+XFixesSelectionNotify&&
    ((XFixesSelectionNotifyEvent*)和event)->selection==bufid)
    {
    如果(!打印选择(显示、窗口、bufname、“UTF8\U字符串”))
    打印选择(显示、窗口、bufname、“字符串”);
    fflush(stdout);
    }
    }
    }
    ...
    
    这适用于
    bufname==“剪贴板”
    bufname==“主”
    选择


    另请参见
    PrintSelection()
    函数。

    Xfixes扩展中使用
    xfixeselectionput()
    并等待
    xfixeselectionnotify
    事件

    例如:

    //gcc-o xclipwatch xclipwatch.c-lX11-lX11
    ...
    #包括
    ...
    无效观察选择(显示*显示,窗口,常量字符*bufname)
    {
    int事件库、错误库;
    XEvent事件;
    Atom bufid=XInternAtom(显示,bufname,False);
    断言(XFixesQueryExtension(显示、事件库和错误库));
    xFixesseSelectionInput(显示、DefaultRootWindow(显示)、bufid、xFixessesSelectionOwnerNotifyMask);
    while(True)
    {
    XNextEvent(显示和事件);
    if(event.type==event_base+XFixesSelectionNotify&&
    ((XFixesSelectionNotifyEvent*)和event)->selection==bufid)
    {
    如果(!打印选择(显示、窗口、bufname、“UTF8\U字符串”))
    打印选择(显示、窗口、bufname、“字符串”);
    fflush(stdout);
    }
    }
    }
    ...
    
    这适用于
    bufname==“剪贴板”
    bufname==“主”
    选择


    另请参见
    PrintSelection()
    函数。

    这没有回答问题。这没有回答问题。当选择所有者关闭时,您会做什么?当选择所有者关闭时,您会做什么?请不要将强制命令放入
    assert()
    ,(请参见
    NDEBUG
    )。更好:
    intxfixinstalled=XFixesQueryExtension(显示、事件库和错误库);断言(xfixinstalled)请不要将强制命令放入
    assert()
    ,(请参阅
    NDEBUG
    )。更好:
    intxfixinstalled=XFixesQueryExtension(显示、事件库和错误库);断言(xfixinstalled)
    
    // gcc -o xclipwatch xclipwatch.c -lX11 -lXfixes
    ...
    #include <X11/extensions/Xfixes.h>
    ...
    void WatchSelection(Display *display, Window window, const char *bufname)
    {
      int event_base, error_base;
      XEvent event;
      Atom bufid = XInternAtom(display, bufname, False);
    
      assert( XFixesQueryExtension(display, &event_base, &error_base) );
      XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid, XFixesSetSelectionOwnerNotifyMask);
    
      while (True)
      {
        XNextEvent(display, &event);
    
        if (event.type == event_base + XFixesSelectionNotify &&
            ((XFixesSelectionNotifyEvent*)&event)->selection == bufid)
        {
          if (!PrintSelection(display, window, bufname, "UTF8_STRING"))
            PrintSelection(display, window, bufname, "STRING");
    
          fflush(stdout);
        }
      }
    }
    ...