Рэймонд Чен объясняет, почему Ctrl+C иногда не регистрируется и почему в Microsoft сделали именно так
Рэймонд Чен объясняет, почему Ctrl+C иногда не регистрируется и почему в Microsoft сделали именно так

Одиночное нажатие Ctrl+C, после которого ничего не копируется, не выдуманная проблема. Служба журнала буфера обмена Microsoft отслеживает изменения асинхронно, поэтому второе копирование может произойти до того, как система зафиксирует первое. В компании такое архитектурное решение называют осознанным.

Многие пользователи по привычке нажимают Ctrl+C несколько раз, чтобы точно убедиться, что данные скопировались. Эта привычка не исчезает и в Windows 11. Казалось бы, одного нажатия должно хватать, но оно срабатывает не всегда. Долгое время это можно было считать паранойей, однако такой рефлекс знаком огромному числу людей.

Ctrl+C в Windows 11
Ctrl+C в Windows 11

Вчера стал вирусным мем из PC Master Race в X, высмеивающий тех, кто по несколько раз жмёт Ctrl+C перед вставкой. Генеральный директор Epic Games Тим Суини ответил на него, упомянув Павана Давулури из Microsoft: “Никто не понимает, почему однократное нажатие Ctrl+C срабатывает не всегда, и это раздражает 99,99% пользователей Windows.”

Мем про Ctrl+C в Windows
Мем про Ctrl+C в Windows

На момент публикации Давулури не ответил. Однако редакция выяснила, что Рэймонд Чен, старший инженер-программист Microsoft, который работает над Windows больше тридцати лет и ведёт блог Old New Thing, уже дал ответ на этот вопрос. По сути, это максимально официальное объяснение.

Почему журнал буфера обмена Windows пропускает быстрые нажатия Ctrl+C

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

Буфер обмена Windows 11. Изображение: Microsoft
Буфер обмена Windows 11. Изображение: Microsoft

Служба журнала буфера обмена следит за изменениями через функцию Windows AddClipboardFormatListener. Она уведомляет программу только после того, как буфер обмена уже изменился. Чен пояснил, что уведомление приходит асинхронно, поэтому к моменту, когда служба журнала узнаёт о первом копировании, буфер обмена может измениться во второй или третий раз. В результате служба фиксирует только то, что находится в буфере в момент проверки, а не всё, что через него прошло.

Старая система просмотра буфера обмена работала иначе: она получала уведомление в момент изменения буфера. Чен отметил, что у синхронных уведомлений есть реальная цена. Программа, которая ведёт себя некорректно при получении обновления буфера, может подвесить или замедлить буфер обмена для всех остальных приложений. Асинхронные уведомления лишены этой проблемы, но пропускают быстрые промежуточные нажатия Ctrl+C.

Чен назвал такое поведение не ошибкой, а особенностью. По его словам, пропуск мелких изменений буфера обмена “в некотором роде особенность службы журнала буфера обмена”, потому что данные, которые задерживаются в буфере лишь на долю секунды, всё равно недостаточно долго доступны для вставки. С точки зрения того, кто нажимает Ctrl+V, значение имеет только последнее значение, поэтому служба просто отражает то, что пользователь видит в буфере обмена.

Журнал буфера обмена в Windows 11
Журнал буфера обмена в Windows 11

Под публикациями Чена часто появляются комментарии, но под этим объяснением читатели возражали. Один из них назвал саму идею предварительной загрузки буфера обмена “ужасной”, поскольку буфер используется не для ручного копирования и вставки.

Чен привёл реальный пример: кабинет врача переносит данные пациентов из системы направлений в отдельную систему планирования. Там небольшая утилита, которая ставит несколько полей в очередь для вставки, удобнее, чем двадцать раз вручную щёлкать по одним и тем же полям.

Microsoft объяснила, как разработчики могут обойти асинхронную задержку

В следующей публикации, вышедшей на следующий день, Чен показал, как программа может дожидаться регистрации каждого изменения буфера обмена перед следующим копированием. Приём основан на событии Clipboard.HistoryChanged из WinRT API буфера обмена. Оно возникает каждый раз, когда служба журнала завершает обработку изменения.

Пример кода создаёт очередь диспетчера, которая работает как поток пользовательского интерфейса, поскольку WinRT API буфера обмена требует его наличия. Затем создаётся объект события Windows, который получает сигнал при каждом срабатывании HistoryChanged. После записи каждой строки в буфер обмена программа ждёт этот сигнал и только потом записывает следующую. Это гарантирует, что служба журнала успела обработать предыдущее изменение. Чен отметил, что это лишь набросок полноценного решения: если пользователь вручную очистит журнал во время выполнения, программа останется ждать события, которое не произойдёт.

Эта асинхронная передача, как ни странно, и позволяет техническому директору Microsoft Azure Марку Руссиновичу запускать DOOM внутри MS Paint. Он вставлял через буфер обмена один отрендеренный кадр за другим достаточно быстро, чтобы это выглядело как настоящая игра. По словам Руссиновича, ранняя сборка этого проекта столкнулась с той же гонкой состояний, которую описал Чен: новые кадры перезаписывали старые до того, как Paint успевал их прочитать.

У журнала буфера обмена Windows 11 есть и другие особенности

Журнал буфера обмена пригождается ежедневно. После нажатия Ctrl+C обычно открывают Win+V, чтобы выбрать нужный элемент перед вставкой, потому что к этому моменту в журнале часто уже несколько записей.

Проблема с быстрым копированием не единственная причина, по которой журнал буфера обмена может казаться ненадёжным.Редакция сообщала, что некоторые приложения используют отложенную отрисовку: программа сообщает Windows, что может предоставить данные буфера обмена, но не передаёт их сразу, и Windows ждёт появления этих данных до 30 секунд. Если скопировать большую таблицу в формате Rich Text из Excel, приложение может не уложиться в это окно, и журнал останется пустым или продолжит показывать старые данные.

Пустой журнал буфера обмена Windows
Пустой журнал буфера обмена Windows

Конечно, эти проблемы связаны не с тем, что перед нами Windows 11, как часто считают в интернете. Ещё в публикации 2011 года (за десять лет до Windows 11) Чен описывал старую цепочку просмотрщиков буфера обмена как хрупкую по своей сути. Одно некорректно работающее приложение в этой цепочке могло сломать уведомления для всех остальных программ, которые следят за буфером обмена, или даже создать бесконечный цикл.

Уже тогда Чен рекомендовал использовать AddClipboardFormatListener в качестве исправления, а также менее известный вариант с порядковым номером буфера обмена. Это счётчик, который Windows увеличивает при каждом изменении буфера, и программы могут опрашивать его вместо ожидания уведомления.

Паван Давулури обычно не уклоняется от ответов. С учётом того, что Windows 11 в 2026 году исправляют даже в мелочах, например обновляют индикатор указателя мыши, возможно, появится исправление и для частых сбоев Ctrl+C. Но даже если это произойдёт, двадцатилетняя привычка жать Ctrl+C по несколько раз вряд ли исчезнет.

Как вы обычно копируете и вставляете в Windows 11?