Как стать автором
Обновить

Удивительное рядом. Как устроен буфер обмена в Windows и Linux

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров22K
Всего голосов 52: ↑51 и ↓1+69
Комментарии20

Комментарии 20

На рабочем компьютер впервые столкнулся с тем, что буфер обмена windows становится полностью недоступен. Во всех приложениях просто ничего не вставляется, если вставить из недоступного буфера в .NET приложениях, возникает ошибка - win32exception openClipboard error_access_denied.

Лечится только перезагрузкой.

У вас какое-то приложение OpenClipboard вызвало, а CloseClipboard нет. И всё, буфер обмена становится недоступен вообще для всех.

Звучит как анекдот.

Закрытие приложения решит проблему (винда почистит всё) или нет?

Ну приложение при закрытии может и не закрыть клипборд :)
Так что с гарантией только перезагрузка

При закрытии отпускает, да

У меня подозрение на антивирус или другое приложение связанное с безопасностью.

Про X11 как-то не очень понятно.
Как сохраняются данные в буфере обмена при закрытии программы? Почему для одних программ, если скопировать текст и закрыть окно, то скопированное потеряется, а для других программ такой проблемы нет?


Также что-то мутное про сохранение ограниченного объема данных в свойствах окна: на практике сотни мегабайт данных очень бодро копипастятся. Ни разу не сталкивался с ограничением на объём буфера обмена.

В свойство окна влезает то ли 32, то ли 64 кб данных. Чтобы передать больше используется совершенно проклятый протокол INCR, где через уведомления об изменениях свойств окон организуют что-то типа пайпа.

Так и не понял, в вяленом что, буфер по выделению/средней кнопке отменили что ли?

Проверил (рядом открыто окно Konsole, сессия wayland) - работает по средней кнопке. И в браузере тоже.

Кстати, вставка (и копирование в) по средней кнопке мыши не работает в программах на базе SDL2. Мне приходилось компилить свою версию libsdl2 с поддержкой доступа к PRIMARY буферу.

Я был очень удивлён когда узнал сколько информации браузер кладёт в буфер обмена при простом копировании текста.
nirsoft InsideClipboard
nirsoft InsideClipboard

Размер в байтах?

Скорее всего да, но обозначений нет, nirsoft InsideClipboard.

Сталкивался с тем, что в винде в некоторых случаях почему-то сбрасывается буфер при закрытии окна. Не могу сходу вспомнить кто так работал, кажется какой-то из редакторов.

Это в случае использования буфера с отложенным рендерингом - в этом случае нет приложения и логично данные недоступны. Некоторые приложения при закрытии спрашивают что делать с содержимым буффера - оставить его доступным или удалить - это тот самый случай, когда выбираешь оставить на самом деле приложение его пересохраняет но уже в привычном для всех формате, при этом специфические возможности вставки могут отсутствовать - например есл и редактор векторный то он может выдать по запросу в векторе или bitmap, приложение клиент при вставке может предпочитать вектор и всё будет красиво, а потом мы закрыли приложение а после себя в буфере оно оставило только bitmap и последующая вставка будет уже не в векторе с соответствующими ньюансами и артефактами.

теоретически копипаст должен работать в разных программах, даже если клиенты находятся на разных компьютерах и подключены к одному X-серверу через интернет

Написано, как будто это какая экзотика. Нормально штатно работает.

В Windows никак не могут нормально доделать RDPCLIP, начиная с самых первых версий. Если начать копировать данные через RDP, и что то поместить в буфер обмена локально, копирование вылетает с ошибкой. При этом вообще непонятно что мешает исправить настолько простой баг, почему бв при вставке не запомнить список который копируется, и освободить буфер.

У visual студии есть (или была) неприятная фича, если скопировать текст из редактора, а потом удалить или изменить скопированный участок, то вставляется пустое место.

Есть у меня такой прикол в Wayland, что я не могу вставить через Shift+Insert то, что было скопировано не через Ctrl+C. Приходится открывать vim, вставлять через p, выделять мышкой в терминале и копировать через Ctrl+C. Как это победить — не знаю.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий