2012-01-06 169 views
9

我必須監視X11剪貼板。X11獲取剪貼板文本

目前,我要求每5秒剪貼板選擇,然後我散列從剪貼板返回的文本,我將它與最後一次檢查的散列計算進行比較。如果哈希不一樣,我分析文本內容並做一些東西...

我不喜歡我的方法。我來自Windows和winapi,當剪貼板發生變化時,內核會通知您的程序,並且效率更高!

我只想知道當剪貼板發生變化時X11是否可以通知您的程序爲winapi?使用X11檢查剪貼板修改的更有效方法是什麼?

回答

0

這裏有一個很好的參考:使用GetSelectionOwner(PRIMARY和剪貼板)通過發送SelectionRequest選擇

  • 獲取副本選擇http://www.jwz.org/doc/x-cut-and-paste.html

  • +3

    這不回答這個問題。 – 2012-01-06 17:03:08

    2
    1. 查找窗口,通知應用程序
    2. 手錶SelectionClear事件
    3. 更新窗口與選擇使用ID從SelectionClear事件,轉到第2步
    +0

    當選擇所有者關閉時,您會做什麼? – retroj 2017-12-21 04:44:05

    1

    使用XFixesSelectSelectionInput()Xfixes擴展名和等待XFixesSelectionNotify事件。

    例子:

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

    這既適用bufname == "CLIPBOARD"bufname == "PRIMARY"選擇。

    另請參閱PrintSelection()功能in this answer