Foreversoft.ru

IT Справочник
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка при вызове openclipboard

Ошибка CLIPBRD_E_CANT_OPEN при установке буфера обмена из .NET

Почему следующий код иногда вызывает исключение с содержимым «CLIPBRD_E_CANT_OPEN»:

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

6 Ответов

Это вызвано ошибкой / функцией в буфере обмена Terminal Services (и возможными другими вещами) и реализацией буфера обмена .NET. Задержка при открытии буфера обмена вызывает ошибку, которая обычно проходит в течение нескольких миллисекунд.

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

На самом деле, я думаю, что это вина Win32 API .

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

Просто так получилось, что Terminal Services отслеживает буфер обмена, и в более старых версиях Windows (pre-Vista) вам нужно открыть буфер обмена, чтобы увидеть, что находится внутри. что в конечном итоге блокирует вас. Единственное решение-дождаться, пока Terminal Services закроет буфер обмена, и повторить попытку.

Однако важно понимать, что это не является специфичным для Terminal сервисов: это может произойти с чем угодно. Работа с буфером обмена в Win32-это гигантское состояние гонки. Но, поскольку по замыслу вы должны только возиться с буфером обмена в ответ на ввод пользователя, это обычно не представляет проблемы.

Я знаю, что этот вопрос стар, но проблема все еще существует. Как уже упоминалось ранее, это исключение возникает, когда системный буфер обмена блокируется другим процессом. К сожалению, есть много инструментов для обрезки, программ для скриншотов и инструментов копирования файлов, которые могут блокировать буфер обмена Windows. Таким образом, вы будете получать исключение каждый раз, когда вы пытаетесь использовать Clipboard.SetText(str) , когда такой инструмент установлен на вашем PC.

никогда не использовать

используйте вместо этого

На самом деле здесь может быть и другая проблема. Вызов фреймворка (как WPF, так и WinForm вкусов) к чему-то вроде этого (код от reflector):

Обратите внимание, что SetDataObject всегда вызывается с true в этом случае.

Внутренне это вызывает два вызова win32 api, один для установки данных и один для удаления их из вашего приложения, чтобы они были доступны после закрытия приложения.

Я видел несколько приложений (некоторые плагины chrome и менеджер загрузок), которые прослушивают событие буфера обмена. Как только произойдет первый вызов, приложение откроет буфер обмена, чтобы посмотреть данные, а второй вызов для сброса завершится неудачей.

Не нашел хорошего решения, кроме как написать свой собственный класс буфера обмена, который использует прямой win32 API или вызвать setDataObject напрямую с false для хранения данных после закрытия приложения.

Я решил эту проблему для моего собственного приложения, используя собственные функции Win32: OpenClipboard(), CloseClipboard() и SetClipboardData().

Ниже класса обертки, который я сделал. Может ли кто-нибудь, пожалуйста , просмотреть его и сказать, является ли он правильным или нет . Особенно когда управляемый код выполняется как приложение x64 (я использую любой CPU в параметрах проекта). Что происходит, когда я ссылаюсь на библиотеки x86 из приложения x64?

Это происходит со мной в моем приложении WPF. Я получил OpenClipboard сбой (исключение из HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN)).

решение состоит в том, чтобы сначала очистить буфер обмена

Похожие вопросы:

Кто-нибудь заметил, что если вы извлекаете HTML из буфера обмена, он получает неверную кодировку и вводит странные символы? Например, выполнение такой команды: string s = (string).

Читать еще:  Ошибка 2 automation error

При каких обстоятельствах функция Win32 API OleGetClipboard() выйдет из строя и вернет CLIPBRD_E_CANT_OPEN ? Дополнительная информация: я помогаю с исправлением ошибки Firefox. Подробности здесь.

У меня возникли проблемы с буфером обмена, и я получаю это сообщение об ошибке каждый раз, когда я пытаюсь сделать операцию копирования / вставки из файла Excel. Код разрывается на.

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

Я делаю это в C#,, но, я думаю,это не языковая проблема. У меня есть пример кода о том, как определить, когда содержимое буфера обмена изменяется. Теперь я хочу изменить текст, который только что.

Я пишу надстройку C# Word 2013, которая запутывает содержимое буфера обмена, если копируемое содержимое находится в управляемом приложении Word. У меня есть несколько вопросов. Я столкнулся с.

Ошибка CLIPBRD_E_CANT_OPEN при настройке буфера обмена из .NET.

Почему следующий код иногда вызывает исключение с содержимым «CLIPBRD_E_CANT_OPEN»:

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

.net clipboard wpf

6 ответов

29 Решение Tadmas [2008-09-16 05:21:00]

На самом деле, я думаю, что это ошибка Win32 API.

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

Так получилось, что службы терминалов отслеживают буфер обмена, а в старых версиях Windows (pre-Vista) вам нужно открыть буфер обмена, чтобы увидеть, что внутри. что в конечном итоге блокирует вас. Единственное решение — дождаться, когда Terminal Services закроет буфер обмена и повторит попытку.

Важно понимать, что это не относится к службам терминалов, однако: это может произойти с чем угодно. Работа с буфером обмена в Win32 — это гигантское состояние гонки. Но, поскольку по дизайну вы должны только гадать с буфером обмена в ответ на ввод пользователя, это обычно не представляет проблемы.

Это вызвано ошибкой/функцией в буфере обмена служб терминалов (и, возможно, другими вещами) и внедрением .NET в буфер обмена. Задержка при открытии буфера обмена вызывает ошибку, которая обычно проходит в течение нескольких миллисекунд.

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

8 pr0gg3r [2016-08-24 16:46:00]

Я знаю, что этот вопрос старый, но проблема все еще существует. Как упоминалось ранее, это исключение возникает, когда системный буфер обмена блокируется другим процессом. К сожалению, многие инструменты для съёмки, программы для скриншотов и инструменты копирования файлов, которые могут блокировать буфер обмена Windows. Таким образом, вы получите исключение каждый раз, когда пытаетесь использовать Clipboard.SetText(str) , когда такой инструмент установлен на вашем ПК.

никогда не используйте

На самом деле может быть и другая проблема. Рамочный вызов (как WPF, так и winform) к чему-то вроде этого (код от рефлектора):

Обратите внимание, что SetDataObject всегда вызывается с истинным в этом случае.

Внутренне, что вызывает два вызова win32 api, один для установки данных и один для его очистки от вашего приложения, чтобы он был доступен после закрытия приложения.

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

Читать еще:  Cout не является однозначным ошибка c

Не нашли хорошего решения, кроме как написать собственный класс буфера обмена, который использует прямой API win32 или вызвать setDataObject напрямую с помощью false для хранения данных после закрытия приложения.

4 Mar [2015-05-11 13:45:00]

Я решил эту проблему для своего собственного приложения, используя собственные функции Win32: OpenClipboard(), CloseClipboard() и SetClipboardData().

Ниже класс обертки, который я сделал. Может ли кто-нибудь просить проверить его и сообщить, правильно ли он или нет. Особенно, когда управляемый код работает как приложение x64 (я использую любой CPU в вариантах проекта). Что происходит, когда я ссылаюсь на библиотеки x86 из приложения x64?

0 MaxyDav [2017-05-11 11:36:00]

Это происходит со мной в моем приложении WPF. У меня возникла ошибка OpenClipboard (исключение из HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN)).

решение состоит в том, чтобы сначала очистить буфер обмена

Ошибка при вызове openclipboard

Опции темы

Adept
Дата 21.9.2009, 14:29 (ссылка) | (нет голосов) Загрузка .

Бывалый

Профиль
Группа: Участник
Сообщений: 210
Регистрация: 10.7.2003
Где: Санкт-Петербург

Репутация: нет
Всего: 2

Код
TextBox TBH2 = new TextBox();
TBH2.Text = «qqq»
Clipboard.Clear();
TBH2.SelectAll();
TBH2.Copy();

Clipboard.clear() выкидывает исключение COMExeption
ошибка при вызове OpenClipboard(Исключение из HRESULT: 0x800401D0(CLIPBRD_E_CANT_OPEN))»

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

Код
private void textCopyClipboard(TextBox textBox)
<
for (int i = 0; i

Опытный

Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 4
Всего: 13

wester
Дата 21.9.2009, 17:38 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.7.2010

Репутация: нет
Всего: нет

Akbar
Дата 28.1.2011, 06:45 (ссылка) | (нет голосов) Загрузка .
Google
Дата 4.4.2020, 01:51 (ссылка)
  • Что же такое .NET? Краткое описание,изучаем.
  • Какой язык программирования выбрать? выбираем.
  • C#. С чего начать? начинаем.
  • Защита исходного кода .NET приложений, защищаем.
  • Литература по .NET, обращаемся.
  • FAQ раздела,ищем здесь.
  • Архиполезные ссылки:www.connectionstrings.com, www.pinvoke.net, www.codeproject.com

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс «транслит» если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим 🙂
Так же не забывайте отмечать свой вопрос решенным, если он таковым является 🙂

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »

[ Время генерации скрипта: 0.0969 ] [ Использовано запросов: 21 ] [ GZIP включён ]

c# — ошибка при вызове openclipboard исключение из hresult 0x800401d0 clipbrd_e_cant_open))

Ошибка OpenClipboard при копировании данных из WPF DataGr > (6)

Для этой цели есть подпись события / метода DataGrid CopyingRowClipboardContent (отправитель объекта, DataGridRowClipboardEventArgs e) и более надежна, чем Clipboard.SetDataObject (данные) или Clipboard.SetText (данные).

Вот как это использовать.

Установите «FullRow» в режиме SelectionUnit для DataGrid, называемого myDataGrid

У нас есть метод myDataGrid_CopyingRowClipboardContent, который вызывается для каждой строки в dataGrid для копирования его содержимого в буфер обмена. Например, для datagrid с семью строками это называется семь раз.

У меня есть приложение WPF, использующее datagrid. Приложение отлично работало, пока я не установил предварительный просмотр Visual Studio 2012 и Blend + SketchFlow. Теперь, когда я пытаюсь скопировать данные из сетки в буфер обмена с помощью Ctrl + C (в любом приложении), я получаю следующее исключение:

Это действительно раздражает.

Я видел некоторые ссылки на эту проблему here и в разных местах в Интернете, без реального решения.

Я могу проверить, заблокирован ли буфер обмена, когда это исключение создано в Visual Studio, поскольку я не мог скопировать вставку сообщения (должен был записать его в файл). Кроме того, буфер обмена не был заблокирован до начала процесса копирования.

Как решить эту проблему?

Добавив свой ответ из упомянутого вопроса SO для справки —

Технически только 1 процесс может открыть буфер обмена, поэтому, если другой процесс откроет его, последующие запросы потерпят неудачу, пока первый не освободит буфер обмена. Это было похоже на класс WinForms Clipboard, в котором он повторил набор с задержкой между каждой попыткой, но класс буфера обмена WPF не делает этого, поэтому, если он не сработает при первом показе исключения. Даже тогда мы должны, вероятно, поймать исключение и поднять ошибку операции с буфером обмена, если он все еще не работает.

То же самое объясняется, и некоторые способы исправить это упоминаются в этом итальянском блоге —

После обсуждения форума MSDN можно предположить, что это может быть проблема с машиной —

У меня была та же проблема при копировании ячеек Excel в буфер обмена и получение данных из буфера обмена в виде строки HTML.

Вы можете использовать (while-try-catch), как в приведенном ниже коде.

Кроме того, вы можете иметь счетчик в то while если цикл более 10 раз или более, возникает исключение. Я тестирую его максимальный счетчик — это одно и одноразовое управление буфером.

У меня была такая же проблема с RichTextBox. Следующий код разбился случайным образом:

Кажется, что лучше использовать System.Windows.Controls.RichTextBox.Copy

У меня также была эта проблема в WPF 4.0 и 4.5, так как я установил TeraCopy (Windows 7, 64-разрядный). У каждого Clipboard.SetText () произошел сбой в System.Runtime.InteropServices.COMException.

Моим первым решением было удалить TeraCopy — это сработало, но мне нравится это приложение, поэтому мне пришлось искать другое решение для решения этой проблемы. Решение заключалось в замене

У меня тоже возникла проблема в приложении, где я копирую информацию в буфер обмена, когда пользователи просматривают ListBox. Скопированная информация относится к выбранному элементу и позволяет им вставлять его (указанную информацию) в другие приложения для удобства. Иногда я получаю CLIPBRD_E_CANT_OPEN на некоторых пользовательских системах, но не на других.

Хотя я до сих пор не смог исправить конфликт, мне удалось создать код, чтобы найти приложение, вызывающее конфликт. Я бы хотел по крайней мере поделиться этим кодом в надежде, что это поможет кому-то. Я добавлю инструкцию using , атрибуты и метод, которые я создал, чтобы найти объект Process of the Culprit. Из элемента « Процесс» вы можете получить имя процесса, PID, заголовок главного окна (если оно есть) и другие потенциально полезные данные. Вот строки кода, которые я добавил без кода, который его вызывает. ( ПРИМЕЧАНИЕ. Ниже фрагмента кода у меня есть еще один лакомый кусочек для обмена):

ДРУГОЕ ПРИМЕЧАНИЕ. Еще одна вещь, которую я изменил, которая упростила мой код, заключалась в том, чтобы преобразовать из System.Windows.Clipboard в System.Windows.Forms.Clipboard (см. Класс System.Windows.Forms.Clipboard ), поскольку последний имеет 4- параметр SetDataObject (), который включает в себя счетчик повторов и задержку повтора в миллисекундах. Это, по крайней мере, устранило некоторые из повторных шумов из моего кода.

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

Ссылка на основную публикацию
Adblock
detector