我必須監視X11剪貼板。X11獲取剪貼板文本
目前,我要求每5秒剪貼板選擇,然後我散列從剪貼板返回的文本,我將它與最後一次檢查的散列計算進行比較。如果哈希不一樣,我分析文本內容並做一些東西...
我不喜歡我的方法。我來自Windows和winapi,當剪貼板發生變化時,內核會通知您的程序,並且效率更高!
我只想知道當剪貼板發生變化時X11是否可以通知您的程序爲winapi?使用X11檢查剪貼板修改的更有效方法是什麼?
我必須監視X11剪貼板。X11獲取剪貼板文本
目前,我要求每5秒剪貼板選擇,然後我散列從剪貼板返回的文本,我將它與最後一次檢查的散列計算進行比較。如果哈希不一樣,我分析文本內容並做一些東西...
我不喜歡我的方法。我來自Windows和winapi,當剪貼板發生變化時,內核會通知您的程序,並且效率更高!
我只想知道當剪貼板發生變化時X11是否可以通知您的程序爲winapi?使用X11檢查剪貼板修改的更有效方法是什麼?
這裏有一個很好的參考:使用GetSelectionOwner
(PRIMARY和剪貼板)通過發送SelectionRequest選擇
SelectionClear
事件SelectionClear
事件,轉到第2步當選擇所有者關閉時,您會做什麼? – retroj 2017-12-21 04:44:05
使用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。
這不回答這個問題。 – 2012-01-06 17:03:08