Вопрос Какой файл изменен или событие запущено, когда что-то скопировано в буфер обмена (Ctrl + C)?


Если бы я подключил функцию или программу, которая должна выполняться при изменении содержимого системного буфера обмена, из какого файла я должен продолжать проверять или какое событие запускается и как поймать это событие на языке программирования? Или команда, которая может выводить содержимое буфера обмена на терминал, чтобы я мог продолжать выполнять команду после коротких интервалов и посмотреть, было ли содержимое изменено или нет.

благодаря


2
2017-11-18 17:21


происхождения




ответы:


Существует несколько инфраструктур, поддерживающих буфер обмена и такое поведение.

Например, GTK который обеспечивает событие Gdk GtkClipboard владелец смены который всегда срабатывает при изменении содержимого в буфере обмена. Приложение может быть написано на языке программирования, который поддерживает GTK, такой как C, питон или Вала,

В Vala следующий фрагмент может, например, использоваться для печати на stdout при изменении содержимого буфера обмена

namespace ClipboardChanged
{
    public static int main (string[] args)
    {
        Gtk.init (ref args);

        Gtk.Clipboard clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD);
        clipboard.owner_change.connect(() => {
            stdout.printf("Clipboard has changed\n");
        });

        Gtk.main();

        return 0;
    }
}

Этот фрагмент кода можно сохранить в текстовом файле, например. clipboard-changed.vala и скомпилирован с valac со следующей командой

valac --pkg=gtk+-3.0 clipboard-changed.vala

Конечно, для этого нужно установить valac valac

sudo apt-get install valac

В этом есть только один недостаток, хотя он работает только с основным буфером обмена, но не с основным выбором (выбор содержимого с помощью мыши).


1
2017-11-20 14:07



любые возможности Java для захвата события изменения буфера обмена? - Omar Tariq
Будучи настолько конкретным, я предполагаю, что это не имеет особого отношения к Ubuntu и может быть лучше спрошено на stackoverflow.com. Этот ответ может помочь вам stackoverflow.com/questions/5484927/... - Oliver Sauder


xclip твой друг. Посмотрите man-страницу для получения дополнительной информации, но если вы хотите установить буфер обмена (а не выделенный текст), вы можете использовать xclip -sel clip, затем перейдите к его stdin, чтобы установить буфер обмена.

Есть -i filename параметр читать из файла. -sel выбирает буфер буфера обмена, который вы хотите использовать. Там в p (первичный, если вы выберете что-то. Это то, что посередине middleclick), clip, который используется с CTRL-C и CTRL-V во всех современных средах рабочего стола (по какой-то причине QT2 и Emacs 20 используют основной буфер обмена).

Чтобы получить содержимое буфера обмена, xclip -sel clip -o (отпечатки на stdout). Если вы хотите поместить его в файл, есть необязательный параметр -o для указания файла для его отправки.

Я считаю, что в manpage есть некоторая информация. Подождите когда изменяется буфер обмена. Я просто не мог его расшифровать.

Информация здесь: http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt


1
2017-11-18 17:38



Я не читал xclip справочная страница. Но проблема в этом ответе состоит в том, что если я проверю содержимое буфера обмена, чтобы узнать, когда изменяется буфер обмена, и задайте временной интервал, скажем, 500 мс, тогда все еще есть вероятность, что я пропустил бы содержимое буфера обмена, если пользователь быстро копирует два разных содержимого в течение этого 500 мс. Не уменьшит ли срок, делает его неэффективным и больше похож на взлома, чем на правильный подход? - Omar Tariq