我必须监视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