Помещение копии объекта в буфер обмена Windows приводит к выполнению команд

Обновлено: 21.11.2024

В: Эй, у меня есть интересный вопрос! Я помню, как недавно читал об использовании VBScript для вставки в буфер обмена. Можем ли мы сделать это с помощью PowerShell?

О: Да, да, мы можем! Если мы начнем с PowerShell, гораздо быстрее будет решение!

Вставка содержимого в буфер обмена, старый метод VBScript

Прежде чем показать быстрое и простое решение, давайте узнаем, как можно адаптировать старое решение.

В прошлом, если я хотел что-то вставить в буфер обмена, я шел в магазин, брал клей и…

"ДОХ! Неправильный буфер обмена!» (Знал, что мне нужно было плеснуть немного воды на лицо, прежде чем напечатать это!)

Я должен был сказать, что еще до появления PowerShell у нас было ДВА метода для вставки текстовых данных в буфер обмена.

Одно из них было хорошим простым решением, если вы работали в DOS или имели простой текстовый вывод из VBScript. Вы должны направить вывод в команду клипа, как показано ниже

После этого вы можете вставить захваченный текст с помощью CTRL-V в любом приложении Windows.

Другой метод, который представился сам собой, заключался в использовании некоторого кода, подобного этому, в VBScript

Поэтому я мог легко повторно использовать это решение в PowerShell. Я делаю это на случай, если вы когда-нибудь увидите какой-нибудь старый VBScript, который захотите использовать повторно.

Первая строка в VBScript назначает строку

В PowerShell я могу сделать это следующим образом.

Следующая строка — это место, где создается Comobject.

Эквивалентный код в PowerShell, делающий то же самое и даже использующий то же имя переменной для объекта, будет

Затем с этого момента последние строки просто манипулируют данными в Объекте.

Что в PowerShell будет выглядеть так.

Однако, если вы попробуете это решение в современной версии Windows, оно просто зависнет в PowerShell.

Мы можем добавить одну дополнительную строку к исходному коду, и вы понимаете почему.

В следующем окне показано, почему старое решение, даже при преобразовании в PowerShell, не удалось.

На самом деле, даже если бы мы просто запустили его сегодня на VBScript, он бы точно так же потерпел неудачу.

Недостаток конвертации из VBScript

Значит, это было здорово, вы попытались повторно использовать VBScript для выполнения своей задачи.
В данном случае, поскольку безопасность улучшилась за последние 17 лет, Internet Explorer не может просто вставлять данные в буфер обмена.

Но хотя это хороший способ научиться преобразовывать старый код из VBScript, на самом деле это не лучший способ использования PowerShell по двум причинам.

  1. Он использует Internet Explorer, который для этой цели является большим ресурсом для решения проблемы. Мы также больше не можем автоматизировать таким образом.
  2. PowerShell имеет встроенные командлеты для решения этой проблемы, которые намного проще в использовании. Они не только хорошо работают в Windows PowerShell, но и одинаково хорошо работают во всех поддерживаемых операционных системах при использовании PowerShell 7.x.

Командлеты буфера обмена в PowerShell

Вы можете убедиться, что они существуют, просто используя Get-Command, как в примере ниже

Чтобы заполнить буфер обмена структурой каталогов, например, я могу выполнить следующую строку

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

Чтобы проверить это в PowerShell, вы можете использовать командлет Get-Clipboard.

Так что да, я потратил немного времени, показывая вам, как конвертировать некоторые VBScript. Пожалуйста, сжалься надо мной, ибо мои намерения были благими. Мне стыдно. 🙂

Обзор

Приятно осознавать, что при необходимости можно достаточно просто перейти на PowerShell из VBScript. Существует множество отличных примеров того, как легко управлять средами Windows с помощью VBScript.

Не менее важно понять, почему мы решили начать заново с решения в PowerShell.

Это дает нам решение, в данном случае манипулирование буфером обмена в операционной системе; который одинаков для всех, независимо от того, используете ли вы Windows, macOS, Linux или любую другую поддерживаемую операционную систему для PowerShell 7.x.

Выбор за вами, друзья!

Наконечник шляпы

Эта статья основана на одном из предыдущих сообщений «Могу ли я копировать вывод сценария в буфер обмена»

Я не помню автора, но тогда это был хороший способ научиться программно устанавливать буфер обмена. Пришло время обновить его.

Ваш друг в области автоматизации

Шон Кирни, специалист по работе с клиентами/Microsoft, @PowerShellMan

"Помните, что с отличным PowerShell приходит большая ответственность..."

Шон Кирни

Инженер по работе с клиентами — Microsoft, COGS Apps Infra Support

Подписаться

Читать далее

В: Есть ли простой способ определить и изменить важное членство в группах AD? О. Легко использовать PowerShell 7, WMI и командлеты CIM. WMI Управление Windows .

В: Есть ли простой способ сохранить вывод моего скрипта в текстовый файл, а не отображать его на экране? A: Конечно, есть несколько способов сделать это! PowerShell.

Excel для Microsoft 365 Word для Microsoft 365 PowerPoint для Microsoft 365 Access для Microsoft 365 Publisher для Microsoft 365 Excel для Microsoft 365 для Mac Word для Microsoft 365 для Mac Outlook для Microsoft 365 для Mac PowerPoint для Microsoft 365 для Mac Excel 2021 Word 2021 PowerPoint 2021 Access 2021 Publisher 2021 Excel 2021 для Mac Word 2021 для Mac Outlook 2021 для Mac PowerPoint 2021 для Mac Excel 2019 Word 2019 PowerPoint 2019 Access 2019 Publisher 2019 Excel 2019 для Mac Word 2019 для Mac Outlook 2019 для Mac PowerPoint 2019 для Mac Excel 2016 Word 2016 PowerPoint 2016 Access 2016 Publisher 2016 Excel 2016 для Mac Word 2016 для Mac Outlook 2016 для Mac PowerPoint 2016 для Mac Excel 2013 Word 2013 PowerPoint 2013 Access 2013 Publisher 2013 SharePoint Designer 2007 Excel 2010 Word 2010 Accesser Publisher Outlook 2010 PowerPoint 201010 Publisher Excel 2007 Word 2007 Outlook 2007 PowerPoint 2007 Access 2007 Publisher 2007 Еще. Меньше

Буфер обмена Office позволяет копировать до 24 элементов из документов Office или других программ и вставлять их в другой документ Office. Например, вы можете скопировать текст из сообщения электронной почты, данные из книги или таблицы и графику из презентации, а затем вставить их все в документ. Используя буфер обмена Office, вы можете упорядочить скопированные элементы в документе так, как хотите.

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

Примечание. Вы по-прежнему можете выполнять простое вырезание, копирование и вставку обычным способом, используя кнопки на ленте или сочетания клавиш CTRL+X (Вырезать), CTRL+C (Копировать), или CTRL+V (Вставить).

Открыть панель задач буфера обмена Office

Чтобы открыть панель задач «Буфер обмена», нажмите «Главная», а затем нажмите кнопку запуска диалогового окна «Буфер обмена». Дважды щелкните изображение или текст, который хотите вставить.

Примечание. Чтобы открыть панель задач "Буфер обмена" в Outlook, в открытом сообщении щелкните вкладку "Сообщение", а затем щелкните средство запуска диалогового окна "Буфер обмена" в группе "Буфер обмена".

Копирование и вставка нескольких элементов с помощью буфера обмена Office

Откройте файл, из которого вы хотите скопировать элементы.

Выберите первый элемент, который хотите скопировать, и нажмите CTRL+C.

Продолжайте копирование элементов из тех же или других файлов, пока не соберете все нужные элементы. Буфер обмена Office может содержать до 24 элементов. Если вы скопируете двадцать пятый элемент, первый элемент в буфере обмена Office будет удален.

Поскольку элементы добавляются в буфер обмена Office, запись отображается на панели задач буфера обмена. Самая новая запись всегда добавляется вверху. Каждая запись содержит значок, представляющий исходную программу Office, и часть скопированного текста или миниатюру скопированного изображения.

Нажмите, куда вы хотите вставить элементы. Вы можете вставлять собранные элементы в любую программу Office.

Выполните одно из следующих действий:

Чтобы вставлять элементы по одному, на панели задач "Буфер обмена" дважды щелкните каждый элемент, который нужно вставить.

Чтобы вставить все скопированные элементы, на панели задач "Буфер обмена" нажмите "Вставить все".

Удалить элементы из буфера обмена Office

Вы можете удалять элементы из буфера обмена Office по отдельности или все одновременно.

На панели задач буфера обмена выполните одно из следующих действий:

Чтобы удалить один элемент, нажмите стрелку рядом с элементом, который нужно удалить, а затем нажмите "Удалить".

Чтобы удалить все элементы, нажмите "Очистить все".

Управление отображением буфера обмена Office

Чтобы управлять отображением буфера обмена Office, нажмите «Параметры» в нижней части панели задач.

Описание

Автоматическое отображение буфера обмена Office

Автоматически отображает буфер обмена Office при копировании элементов.

Показывать буфер обмена Office при двойном нажатии клавиш CTRL+C

Автоматически отображает буфер обмена Office при двойном нажатии клавиш CTRL+C.

Собирать без отображения буфера обмена Office

Автоматически копирует элементы в буфер обмена Office, не отображая область задач буфера обмена.

Показывать значок буфера обмена Office на панели задач

Отображает значок буфера обмена Office в области состояния системной панели задач, когда буфер обмена Office активен. Этот параметр включен по умолчанию.

Показывать статус рядом с панелью задач при копировании

Отображает сообщение о собранном элементе при копировании элементов в буфер обмена Office. Этот параметр включен по умолчанию.

Буфер обмена — это место на вашем компьютере, где вы можете временно хранить данные (текст, изображения и т. д.). Когда вы что-то копируете, ваш выбор сохраняется в буфере обмена, где он остается до тех пор, пока вы не скопируете что-то еще или не выключите компьютер. Это означает, что вы можете вставлять одни и те же данные несколько раз и в разные приложения. Буфер обмена содержит только последний скопированный фрагмент.

На Mac вы не можете просматривать или очищать буфер обмена.

Выберите данные, которые вы хотите скопировать.

На стандартной панели инструментов нажмите "Копировать" .

Нажмите место, куда вы хотите вставить данные.

На стандартной панели инструментов нажмите "Вставить" .

Кнопка «Параметры вставки», отображаемая в документе, является временной. Вы можете щелкнуть его, чтобы изменить форматирование вставленного элемента. Чтобы закрыть его, щелкните в любом месте документа, нажмите клавишу ESC или начните вводить текст.

Сочетание клавиш для копирования — + C , а для вставки — + V .

Чтобы сохранить и повторно использовать текст и графику, даже если вы выключите компьютер, вы можете использовать Scrapbook.

В этом разделе есть примеры кода для следующих задач:

Реализация команд «Вырезать», «Копировать» и «Вставить»

В этом разделе описывается, как стандартные команды «Вырезать», «Копировать» и «Вставить» реализованы в приложении. В примере в этом разделе эти методы используются для помещения данных в буфер обмена с использованием зарегистрированного формата буфера обмена, формата CF_OWNERDISPLAY и формата CF_TEXT. Зарегистрированный формат используется для представления прямоугольных или эллиптических текстовых окон, называемых метками.

Выбор данных

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

Создание меню редактирования

Приложение должно загрузить таблицу сочетаний клавиш, содержащую стандартные сочетания клавиш для команд меню "Правка". Функция TranslateAccelerator должна быть добавлена ​​в цикл обработки сообщений приложения, чтобы ускорители вступили в силу. Дополнительные сведения об ускорителях клавиатуры см. в разделе Ускорители клавиатуры.

Обработка сообщения WM_INITMENUPOPUP

Не все команды буфера обмена доступны пользователю в любой момент времени. Приложение должно обработать сообщение WM_INITMENUPOPUP, чтобы включить элементы меню для доступных команд и отключить недоступные команды.

Ниже приведен случай WM_INITMENUPOPUP для приложения с именем Label.

Функция InitMenu определяется следующим образом.

Обработка сообщения WM_COMMAND

Для обработки команд меню добавьте регистр WM_COMMAND в процедуру главного окна приложения. Ниже приведен случай WM_COMMAND для оконной процедуры приложения Label.

Для выполнения команд "Копировать" и "Вырезать" оконная процедура вызывает определяемую приложением функцию EditCopy. Дополнительные сведения см. в разделе Копирование информации в буфер обмена. Для выполнения команды Paste оконная процедура вызывает определяемую приложением функцию EditPaste. Дополнительные сведения о функции EditPaste см. в разделе Вставка информации из буфера обмена.

Копирование информации в буфер обмена

В приложении Label определяемая приложением функция EditCopy копирует текущий выбор в буфер обмена. Эта функция делает следующее:

  1. Открывает буфер обмена, вызывая функцию OpenClipboard.
  2. Очищает буфер обмена, вызывая функцию EmptyClipboard.
  3. Вызывает функцию SetClipboardData один раз для каждого формата буфера обмена, предоставляемого приложением.
  4. Закрывает буфер обмена, вызывая функцию CloseClipboard.

В зависимости от текущего выбора функция EditCopy либо копирует диапазон текста, либо копирует определенную приложением структуру, представляющую всю этикетку. Структура LABELBOX определяется следующим образом.

Ниже представлена ​​функция EditCopy.

Вставка информации из буфера обмена

В приложении Label определяемая приложением функция EditPaste вставляет содержимое буфера обмена. Эта функция делает следующее:

  1. Открывает буфер обмена, вызывая функцию OpenClipboard.
  2. Определяет, какой из доступных форматов буфера обмена нужно извлечь.
  3. Получает дескриптор данных в выбранном формате, вызывая функцию GetClipboardData.
  4. Вставляет копию данных в документ. Дескриптор, возвращенный GetClipboardData, по-прежнему принадлежит буферу обмена, поэтому приложение не должно освобождать его или оставлять заблокированным.
  5. Закрывает буфер обмена, вызывая функцию CloseClipboard.

Если метка выбрана и содержит точку вставки, функция EditPaste вставляет текст из буфера обмена в точку вставки. Если выделение отсутствует или выбрана метка, функция создает новую метку, используя определяемую приложением структуру LABELBOX в буфере обмена. Структура LABELBOX помещается в буфер обмена с использованием зарегистрированного формата буфера обмена.

Структура LABELBOX определяется следующим образом.

Ниже представлена ​​функция EditPaste.

Регистрация формата буфера обмена

Чтобы зарегистрировать формат буфера обмена, добавьте вызов функции RegisterClipboardFormat в функцию инициализации экземпляра вашего приложения следующим образом.

Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS

Если окно передает дескриптор NULL в функцию SetClipboardData, оно должно обрабатывать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS для отображения данных по запросу.

Если окно задерживает рендеринг определенного формата, а затем другое приложение запрашивает данные в этом формате, окну отправляется сообщение WM_RENDERFORMAT. Кроме того, если окно задерживает рендеринг одного или нескольких форматов и если некоторые из этих форматов остаются неотображенными, когда окно вот-вот будет уничтожено, то перед его уничтожением окну будет отправлено сообщение WM_RENDERALLFORMATS.

Чтобы отобразить формат буфера обмена, оконная процедура должна поместить в буфер обмена ненулевой дескриптор данных с помощью функции SetClipboardData. Если оконная процедура отображает формат в ответ на сообщение WM_RENDERFORMAT, она не должна открывать буфер обмена до вызова SetClipboardData. Но если он отображает один или несколько форматов в ответ на сообщение WM_RENDERALLFORMATS, он должен открыть буфер обмена и убедиться, что окно все еще владеет буфером обмена, прежде чем вызывать SetClipboardData , и он должен закрыть буфер обмена перед возвратом.

Приложение Label обрабатывает сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS следующим образом.

В обоих случаях оконная процедура вызывает определяемую приложением функцию RenderFormat, определенную следующим образом.

Структура LABELBOX определяется следующим образом.

Обработка сообщения WM_DESTROYCLIPBOARD

Окно может обрабатывать сообщение WM_DESTROYCLIPBOARD, чтобы освободить любые ресурсы, которые оно выделило для поддержки отложенного рендеринга. Например, приложение Label при копировании этикетки в буфер обмена выделяет объект в локальной памяти. Затем он освобождает этот объект в ответ на сообщение WM_DESTROYCLIPBOARD следующим образом.

Использование формата буфера обмена, отображаемого владельцем

Если окно помещает информацию в буфер обмена с использованием формата буфера обмена CF_OWNERDISPLAY, оно должно выполнить следующие действия:

  • Обработать сообщение WM_PAINTCLIPBOARD. Это сообщение отправляется владельцу буфера обмена, когда необходимо перекрасить часть окна просмотра буфера обмена.
  • Обработать сообщение WM_SIZECLIPBOARD. Это сообщение отправляется владельцу буфера обмена при изменении размера окна просмотра буфера обмена или изменении его содержимого. Как правило, окно реагирует на это сообщение, устанавливая положения и диапазоны прокрутки для окна просмотра буфера обмена. В ответ на это сообщение приложение Label также обновляет структуру SIZE для окна просмотра буфера обмена.
  • Обработка сообщений WM_HSCROLLCLIPBOARD и WM_VSCROLLCLIPBOARD. Эти сообщения отправляются владельцу буфера обмена, когда в окне просмотра буфера обмена происходит событие полосы прокрутки.
  • Обработать сообщение WM_ASKCBFORMATNAME. Окно просмотра буфера обмена отправляет это сообщение в приложение, чтобы получить имя формата отображения владельца.

Оконная процедура для приложения Label обрабатывает эти сообщения следующим образом.

Мониторинг содержимого буфера обмена

Существует три способа отслеживания изменений в буфере обмена. Самый старый метод — создать окно просмотра буфера обмена. В Windows 2000 добавлена ​​возможность запрашивать порядковый номер буфера обмена, а в Windows Vista добавлена ​​поддержка прослушивателей формата буфера обмена. Окна просмотра буфера обмена поддерживаются для обратной совместимости с более ранними версиями Windows. Новые программы должны использовать прослушиватели формата буфера обмена или порядковый номер буфера обмена.

Запрос порядкового номера буфера обмена

Каждый раз, когда содержимое буфера обмена изменяется, увеличивается 32-битное значение, известное как порядковый номер буфера обмена.Программа может получить текущий порядковый номер буфера обмена, вызвав функцию GetClipboardSequenceNumber. Сравнивая возвращаемое значение со значением, возвращенным предыдущим вызовом GetClipboardSequenceNumber, программа может определить, изменилось ли содержимое буфера обмена. Этот метод больше подходит для программ, которые кэшируют результаты на основе текущего содержимого буфера обмена и должны знать, действительны ли вычисления, прежде чем использовать результаты из этого кэша. Обратите внимание, что это не метод уведомления, и его не следует использовать в цикле опроса. Чтобы получать уведомления об изменении содержимого буфера обмена, используйте прослушиватель формата буфера обмена или средство просмотра буфера обмена.

Создание прослушивателя формата буфера обмена

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

Окно регистрируется как прослушиватель формата буфера обмена путем вызова функции AddClipboardFormatListener. Когда содержимое буфера обмена изменяется, в окно отправляется сообщение WM_CLIPBOARDUPDATE. Регистрация остается действительной до тех пор, пока окно не отменит регистрацию, вызвав функцию RemoveClipboardFormatListener.

Создание окна просмотра буфера обмена

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

  • Добавить окно в цепочку средств просмотра буфера обмена.
  • Обработать сообщение WM_CHANGECBCHAIN.
  • Обработать сообщение WM_DRAWCLIPBOARD.
  • Удалить окно из цепочки средств просмотра буфера обмена, прежде чем оно будет уничтожено.

Добавление окна в цепочку просмотра буфера обмена

Окно добавляется в цепочку средств просмотра буфера обмена, вызывая функцию SetClipboardViewer. Возвращаемое значение — это дескриптор следующего окна в цепочке. Окно должно отслеживать это значение, например, сохраняя его в статической переменной с именем hwndNextViewer .

В следующем примере окно добавляется в цепочку средств просмотра буфера обмена в ответ на сообщение WM_CREATE.

Фрагменты кода показаны для следующих задач:

Обработка сообщения WM_CHANGECBCHAIN

Окно средства просмотра буфера обмена получает сообщение WM_CHANGECBCHAIN, когда другое окно удаляет себя из цепочки средств просмотра буфера обмена. Если удаляемое окно является следующим окном в цепочке, окно, получающее сообщение, должно отсоединить следующее окно от цепочки. В противном случае это сообщение должно быть передано следующему окну в цепочке.

В следующем примере показана обработка сообщения WM_CHANGECBCHAIN.

Удаление окна из цепочки просмотра буфера обмена

Чтобы удалить себя из цепочки просмотра буфера обмена, окно вызывает функцию ChangeClipboardChain. В следующем примере окно удаляется из цепочки средств просмотра буфера обмена в ответ на сообщение WM_DESTROY.

Обработка сообщения WM_DRAWCLIPBOARD

Сообщение WM_DRAWCLIPBOARD уведомляет окно просмотра буфера обмена об изменении содержимого буфера обмена. При обработке сообщения WM_DRAWCLIPBOARD окно должно делать следующее:

  1. Определите, какой из доступных форматов буфера обмена следует отображать.
  2. Получить данные из буфера обмена и отобразить их в окне. Или, если формат буфера обмена — CF_OWNERDISPLAY , отправьте сообщение WM_PAINTCLIPBOARD владельцу буфера обмена.
  3. Отправить сообщение в следующее окно в цепочке просмотра буфера обмена.

Пример обработки сообщения WM_DRAWCLIPBOARD см. в списке примеров в Примере средства просмотра буфера обмена.

Командлет Set-Clipboard устанавливает содержимое буфера обмена.

В Linux этот командлет требует наличия в пути утилиты xclip.

Примеры

Пример 1. Копирование текста в буфер обмена

Пример 2. Копирование содержимого файла в буфер обмена

В этом примере содержимое файла передается в буфер обмена. В этом примере мы получаем открытый ключ ssh, чтобы его можно было вставить в другое приложение, например GitHub.

Параметры

Указывает, что командлет не очищает буфер обмена и не добавляет в него содержимое.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Запрашивает подтверждение перед запуском командлета.

< /tr>

Возвращает объект, представляющий элемент, с которым вы работаете. По умолчанию этот командлет не создает никаких выходных данных.

Тип:SwitchParameter
Псевдонимы:cf
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:False
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Строковые значения для добавления в буфер обмена.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:True< /td>
Допускать подстановочные знаки:False

Показывает, что произойдет, если командлет запустится. Командлет не запущен.

< /tr>

Входные данные

Примечания

В редких случаях при использовании Set-Clipboard с большим количеством значений в быстрой последовательности, например в цикле, вы можете время от времени получать пустое значение из буфера обмена. Это можно исправить, используя Start-Sleep -Milliseconds 1 в цикле.

Читайте также:

Тип:SwitchParameter
Псевдонимы:wi
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False