-
#1
Hello,
I’ve been using a certain subroutine to copy and paste the values of particular cells from Excel into a different program, and until recently this has been working fantastically. But now, all of a sudden, when I try to run this sub on certain cells, I get this error: «-2147221040 (800401D0) — OpenClipboard Failed». I call the copy-and-paste sub on a lot of different cells in various macros, but for some reason the error is always thrown on the third line:
Code:
Public Sub VeryFirstPartOfOneOfMySubs(
CP ("$CB$3") 'This works fine
Sleep (100)
CP ("$BA$16") 'The error shows up here
Sleep (50)
...
End Sub
I don’t think it’s an issue of increasing the sleep time, because it’s never needed it in the past. Here’s the derivative sub («CP», short for «copy-paste»):
Code:
Private Sub CP(Rnge As String)
Dim MyData As New MSForms.DataObject
MyData.SetText Range(Rnge).Value
MyData.PutInClipboard 'The error shows up here
RC 'Short for "right-click"; simulates a right-click in another app to paste
Sleep (50)
End Sub
The only thing I can think of is that something I changed in another macro somewhere could be conflicting with normal clipboard functioning — but I don’t know why that would be. The main thing I changed was that I went from manual macro calling (clicking on the ribbon) to a visual, checkbox-and-button based interface.
Also, as another fun fact, the cells the copy-paste sub throws an error on almost always end up getting deleted (presumably by the sub itself). That’s also never happened before, and I don’t understand why an error like that would only just manifest itself now.
Thanks for any insight you might be able to provide.
Last edited:
Excel Joke
Why can’t spreadsheets drive cars? They crash too often!
-
#2
here is a snip of code I use to copy to the clipboard, this can then be copied to anything outside of excel and inserted with control V or paste
Dim myData As DataObject
Set myData = New DataObject
myData.SetText «calendar alert added my outlook»
myData.PutInClipboard
you may need the reference to dataobject, which from memory is automatic if you start a new project and insert a userform, and then delete the project, unless of course you wish to use the form, this will load the references for Microsoft Dataobject V 2.0
-
#3
Thanks for your reply. Unfortunately, if you’ll look up in the second code block, that’s almost exactly the code I used, which is giving me problems. The «MyData.putinclipboard» command, specifically.
-
#4
Thanks for your reply. Unfortunately, if you’ll look up in the second code block, that’s almost exactly the code I used, which is giving me problems. The «MyData.putinclipboard» command, specifically.
I also have had routines that once worked fine no longer do, with a strange twist. Here’s an example:
Function RangeToText(r As Range) As String
Set MyData = New MSForms.DataObject
r.Copy
MyData.GetFromClipboard
RangeToText = MyData.GetText
Set MyData = Nothing
End Function
The procedure stops at the red line and displays the «OpenClipboard Failed» popup. If I then press Debug and then F5 (VBA Run), it works just fine!
Until the next time, that is. Restarting Excel and/or Windows 7 does not help. I’m at wits end on this.
Thanks for any help.
-
#5
I also have had routines that once worked fine no longer do, with a strange twist. Here’s an example:
Function RangeToText(r As Range) As String
Set MyData = New MSForms.DataObject
r.Copy
MyData.GetFromClipboard
RangeToText = MyData.GetText
Set MyData = Nothing
End FunctionThe procedure stops at the red line and displays the «OpenClipboard Failed» popup. If I then press Debug and then F5 (VBA Run), it works just fine!
Until the next time, that is. Restarting Excel and/or Windows 7 does not help. I’m at wits end on this.
Thanks for any help.
I’m having the same problem with similar code. Also, When pasting, I’d like to keep my default signature, not overwrite it.
Here’s the relevant snippet of my code:
Code:
Dim strPaste As Variant
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard
strPaste = DataObj.GetText(1)
With OutMail
.To = Email 'extracted from excel
.BCC = "name@place.com"
.Subject = Subj 'extracted from other level of code
.BodyFormat = 2 '1=Plain text, 2=HTML 3=RichText
.Body = strPaste
.Display
End With
Please help
Last edited:
Пишите свои мнения о программах, расширяющих возможности буфера обмена:
— плюсы/минусы
— потребление памяти
— глюки (обязательно подробности, а не просто она глючная!!)
— удобство для тех или иных применений (укажите, каких)
Сравнивайте разные программы, указывая критерии (не забудьте, что они, как и потребности, у всех индивидуальны), или просто кратко сообщайте о новой программе ( ссылка и описание — обязательно)
CLCL — внешне простая, но весьма функциональная и настраиваемая: плагины, настройка горячих клавиш, фильтр запоминаемых форматов (например, только текст или картинки). Бесплатна и с открытым кодом. Тема в программах
ClipX — по стилю работы напоминает CLCL, но ещё проще и меньше, лучше настраиваются клавиши, хранит картинки, удобный фильтр-поиск. Тема в программах
Clibor — компактный по размеру, портативный менеджер от японских производителей. Поддерживает FIFO/LIFO, Unicode, инкрементный поиск, пароль при запуске и многое другое Доступны переводы версии 1.4.9 и Русская сборка 1.4.9
ClipDiary — простой, но продуманный и вполне достаточный большинству буфер.
ClipCache Pro — навороченный буфер. Редактирование, фильтры, информация источника и т.д.
ClipAngel — удобный фильтр, поддержка отображения HTML, RTF, TXT, картинок, списков файлов, редактирование TXT, много операций над клипами и их файлами, горячие клавиши, любимые клипы, эмуляция ввода, сравнение клипов, информация об источнике клипа (заголовок окна, приложение, URL). Бесплатна и с открытым кодом.
Ditto
CopyQ — очень интересный менеджер буфера обмена с большими возможностями. Приложение работает под Linux и Windows.
ClipJump — опенсорсная, на базе знаменитого интерпретатора скриптов AutoHotkey. В целом неплохая, быстрая, лёгкая, довольно функциональная. Подробнее.
ClipboardFusion — авто-форматирование или удаление форматирования, редактирование текста в буфере (авто-удаление символов, пробелов, переводов каретки, табуляций в начале и конце клипа). Поддержка макросов, своих или готовых с офсайта. Тема в варезнике .
ClipMate
ArsClip
Swift Paste — подробнее
Ethervane Echo — Бесплатный. Русского языка нет. Копируемые данные автоматически сортируются и раскидываются по заранее созданным вкладкам. Настройки гибкие, но неудобные.
Spartan
AccelClip — Ссылка на загрузку
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ради интереса и расширения кругозора поюзал пару дней Swift Paste. За это время она раз 5 самопроизвольно «отвалилась» (перестала следить за буфером обмена), приходилось подключать вручную командой [Re-Monitor Clipboard].
Также несколько раз (вне связи с первой проблемой) главное меню теряло атрибут «Поверх всех окон», приходилось его вытаскивать вручную.
Кроме того, выяснилось, что эта полоска у верхнего края дисплея очень сильно мешает работать, куда её ни приткнёшь: заслоняет полезную информацию в заголовках окон приложений. А возможности сделать её отчасти прозрачной не предусмотрено. Расположить эту полоску у левого или правого края дисплея вертикально (как, например, у ArsClip) тоже не предусмотрено.
Единственный разумный вариант: использовать опцию [Auto-hide menu bar]. Но в этом случае приходится прилагать дополнительные усилия и тратить секунды, чтобы сначала достать эту полоску из скрытого состояния. Было бы логично сделать, чтобы меню автоматически вываливались при наведении указателя мыши (без необходимости кликать левой кнопкой), но и такой возможности тоже не предусмотрено
Я что-то упустил?
Добавлено:
В качестве (единственного??) положительного момента (дабы не обвинили в необъективности) : Swift Paste является одним из немногих менеджеров буфера обмена, которые при вызове своего списка клипов не перехватывают фокус ввода. Это позволяет использовать их для вставки в такие специфические места, как, например, окно переименования файла в Windows’ Explorer, Total Commander и пр. (большинство буферных утилит для этого не годятся, так как при вызове списка клипов модальное окно переименования файла автоматически закрывается.)
За буфером обмена следить не прекращала (факт не 100%, мог не обратить внимания).
Поверх всех окон не делал, у меня включено автоскрытие (без него, действительно, мешает).
Ну а так, в целом, согласен. Но я и не думаю её использовать как основной МБО, основной и любимый у меня ClipCachePro. Так, в определённых ситуациях удобна. В автозапуске она у меня тоже не постоянно, потестирую ещё, да уберу, оставлю только ярлык в нужном месте для быстрого доступа.
P. S. А вообще — понравилась прога больше всех прочих МБО, за исключением ClipCachePro, который тоже не без минусов.
P. P. S. Добавил в шапку
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ребята, подскажите пожалуйста, какие из ваших утилит могут обрабатывать текст в буфере по заданному юзером произвольному шаблону? Например, заменить в тексте все буквы «а» на буквы «щ»: копируем в память текст «абракадабра», оно там обрабатывается — и потом возвращает нам слово «щбрщкщдщбщ» Или заключить текст в скобки: копируем «абракадабра», получаем [абракадабра]. И так далее.
Многие из программ, перечисленных в шапке, умеют изменять регистр текста в буфере или удалять символ > в начале строки (ClipCache, CLCL и другие). Но мне нужна именно возможность задать мой собственный произвольный шаблон.
Можете что-то посоветовать?
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Any_utka
Я не уверен на 100%, но посмотрите help к программе ClipJump, где-то, вроде что-то было. (ссылки стрраничкой раньше)
Кстати, про ClipJump.. Обнаружились пара косяков..
1. Мож чего не понимаю, но программа при запуске предупреждает, что для корректной работы необходим запуск от имени Администратора, хотя сама при активации пункта меню «Options-Run at startup «просто добавляет ярлык в папку » Startup» без активации опции «запускать как администратор».
2. Не знаю, что не так с моей системой, но каждые 3-4 дня начинает при запуске вылетать с ощибкой «target label does not exist».
oshizelly
Есть такое. А еще с ним у меня один нужный vbs не работает. Пишет: Ошибка при вызове OpenClipboard
Точне проблема с компилированным в exe vbs. С другими клипборд менеджерами такой ошибки нет.
Добавлено:
Также с ClipJump не работает Опечатка v 2.711 (snoop2).
ClipJump
Также, если навскидку, то:
VirtAssist
Clipboard Master (тяжёлый, грузит в системный реестр сотни!! своих ключей, как какой-нибудь MS Office, но в портабельном варианте можно юзать)
Typing Assistant (это вообще-то не менеджер буфера обмена, но у него есть также некоторый функционал)
Вроде была ещё парочка, если очень надо, могу попробовать припомнить. Или пускай коллективный разум тоже примет участие в викторине
Добавлено:
vadim3sh 23:40 13-05-2014
Цитата:
Openclipboard Failed
Openclipboard Failed
Openclipboard Failed
I keep on having the error «Openclipboard Failed» when I am working on assemblies either with inserting my own parts or assemblies or insterting parts from the toolbox. It has happened ever since I installed SW on my current machine that meets all of SW specs (Pentium D 3.4GHz with 2GB of RAM with a NVIDIA Quadro FX 1500)
I thought my upgrade to 2007 would fix it, but I am still getting the error and my reseller has never seen it before and are working with SW to figure it out. Does anyone have any ideas?
What I do now is just click okay on the error and try again until it works (1 to 5 times)
RE: Openclipboard Failed
I get that error message a lot as well. Dell Precision workstation PWS380 with 2 Gb RAM, NVidia Quadro FX 3450/4000 SDI.
Started in 2006. It seems to happen randomly. The inserted component appears fixed in space but applying any mate to it «frees it up» to be positioned normally. When I get it Solidworks won’t let me insert multiple instances of that component unless I enter it again as I did the first instance.
Even restarting Solidworks doesn’t seem to affect this random situation.
I know this doesn’t help much, but at least you know others experience this as well.
RE: Openclipboard Failed
«What I do now is just click okay on the error and try again until it works (1 to 5 times)»
That’s what I do also whenever I get that error. I just accepted it as one of SW quirks and keep on working. I am using SW06, with SW recommended drivers also, so I think it is a SW error (not user error).
RE: Openclipboard Failed
This may not be a SW error! Or if it is it’s in how SW handles the Windows Clipboard function.
Do a google for Openclipboard Failed & you will see it happens in a lot of different programs.
When you get this error are you drag-n-dropping or using the File > Insert method?
RE: Openclipboard Failed
It makes me happy that I’m not the only one to have this problem (sorry for the others in my boat)
It happens when I drag from the toolbox or file > insert.
I guess I just live with it like everyone else does.
RE: Openclipboard Failed
I use «insert components» from the Command Manager. I didn’t find anything on the SW side for «Openclipboard Failed» though.
RE: Openclipboard Failed
I have the same problem with Solidworks 2004 SP 1. It only happens when I am running on a remote system, though. From what I can tell, it is an issue with Excel being built in, though I have not verified that. All of my research leads me to believe that it is, though. I am wondering now if it has to do with parts that have design tables. if someone has the free time to check into that.
I don’t drag & drop, I use Insert > Existing Component or the Command Manager.
RE: Openclipboard Failed
It happens to us on items without design tables. I’m inclined to agree it’s a Windows-Solidworks problem though. We use Office 2000 here. Maybe that’s a common link?
When I googled «OpenClipboard failed» last week I gave up after seeing how common it is with a lot of software. Looks like one of those things I’ve learned to live with.
RE: Openclipboard Failed
Remember.
«If you don’t use your head,
your going to have to use your feet.»
RE: Openclipboard Failed
Here’s something brand new to me this morning.
I opened a part I created yesterday. I tried to insert it into a new assembly. In the new assy I got the openclipboard failed error. The part did not insert. Solidworks closed itself «DUE TO AN ERROR».
That happened twice so I closed all software, cleared the temp files, and restarted the PC. Opened everything except Excel and tried again. Same result.
Shut down again, cleared TEMP, opened Solidworks only. It worked fine.
Opened my normal software, everything is OK again.
The issue has been annoying for months. Today it elevated itself to #%*@$!
RE: Openclipboard Failed
Red Flag Submitted
Thank you for helping keep Eng-Tips Forums free from inappropriate posts.
The Eng-Tips staff will check this out and take appropriate action.
Reply To This Thread
Posting in the Eng-Tips forums is a member-only feature.
Click Here to join Eng-Tips and talk with other members! Already a Member? Login
Ошибка 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, один для установки данных и один для его очистки от вашего приложения, чтобы он был доступен после закрытия приложения.
Я видел несколько приложений (некоторые хром-плагины и диспетчер загрузки), которые прослушивают событие буфера обмена. Как только первый звонок ударит, приложение откроет буфер обмена, чтобы просмотреть данные, а второй вызов сбросить не удастся.
Не нашли хорошего решения, кроме как написать собственный класс буфера обмена, который использует прямой 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)).
решение состоит в том, чтобы сначала очистить буфер обмена
Ошибка 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).
Мое приложение использует метод Copy() DataGrid для извлечения всех данных для экспорта в CSV и другие форматы. Все, что я делаю-это Очистить буфер обмена Звоните myGrid.Copy() Теперь это обычно.
При каких обстоятельствах функция Win32 API OleGetClipboard() выйдет из строя и вернет CLIPBRD_E_CANT_OPEN ? Дополнительная информация: я помогаю с исправлением ошибки Firefox. Подробности здесь.
У меня возникли проблемы с буфером обмена, и я получаю это сообщение об ошибке каждый раз, когда я пытаюсь сделать операцию копирования / вставки из файла Excel. Код разрывается на.
Мне нужно сделать простое приложение-службу, которое будет привязываться к буферу обмена Windows. В частности, каждый раз, когда происходит операция копирования / вырезания, я хочу проанализировать.
Я делаю это в C#,, но, я думаю,это не языковая проблема. У меня есть пример кода о том, как определить, когда содержимое буфера обмена изменяется. Теперь я хочу изменить текст, который только что.
Я пишу надстройку C# Word 2013, которая запутывает содержимое буфера обмена, если копируемое содержимое находится в управляемом приложении Word. У меня есть несколько вопросов. Я столкнулся с.
Ошибка при вызове openclipboard в solidworks
Hi All! Subj. На последней строчке в этом куске:
windows.BringWindowToTop(h_pars);
PressKeys(«Ctrl+C»,10); // эмуляция нажатия на клавиши
line := Clipboard.AsText;
в стандартном модуле Clipbrd в этои вот месте:
if not OpenClipboard(FClipboardWindow) then
raise Exception.CreateRes(@SCannotOpenClipboard);
прога орет, что не может прочесть буфер. В чем может быть дело?
← →
Jeer © ( 2004-11-17 17:44 ) [1]
Значит там не текст:(
← →
cvg ( 2004-11-17 17:49 ) [2]
Ctrl-C грабит экран в окне, которое стало делается активным в первой приведенной строчке, правильно? Там таблица с меняющимися данными. Последняя строчка преобразует все, что можно, в текст. Так ведь, вроде?
← →
cvg ( 2004-11-17 18:22 ) [3]
Ну что, больше ни у кого никаких мыслей нет?
← →
Jeer © ( 2004-11-17 18:51 ) [4]
← →
cvg ( 2004-11-18 15:03 ) [5]
Не, все-таки она на второй из нижеприведенных строчек она все равно орет «Cannot open Clipboard» :((
if not Clipboard.HasFormat(CF_TEXT):boolean
if not OpenClipboard(FClipboardWindow) then
raise Exception.CreateRes(@SCannotOpenClipboard);
← →
VMcL © ( 2004-11-18 15:07 ) [6]
Что говорит GetLastError или SysErrorMessage?
← →
cvg ( 2004-11-18 15:36 ) [7]
Думешь, это что-нить даст? Самое-то тут противное то, что ана все ети дела грабит с экрана (хотя есть и режим работы с данными из файла), а значит я не могу подлезть с отладчиком.
← →
Amoeba © ( 2004-11-18 15:55 ) [8]
> ана все ети дела грабит с экрана
В таком случае в Clipboard нет никакого текста и
line := Clipboard.AsText;
не лезет ни в какие ворота.
← →
cvg ( 2004-11-18 16:23 ) [9]
Хм, а почему ж тогда рекомендованный Clipboard.HasFormat(CF_TEXT):boolean пропустил все это?
← →
Amoeba © ( 2004-11-18 16:28 ) [10]
выполни после «грабления» экрана вот этот код:
if Clipboard.HasFormat(CF_TEXT) then
line := Clipboard.AsText
else
ShowMessage(«Bla-bla-bla!»);
← →
cvg ( 2004-11-18 17:14 ) [11]
Попробовал. Все равно на строке line := Clipboard.AsText выдала ту же ошибку — «Cannot open Clipboard». Да и не думаю я, что это изменение помогло бы, потому что до этого у меня так вот было:
try
line := Clipboard.AsText;
except
raise Exception.Create(«blah-blah-blah»);
end;
← →
cvg ( 2004-11-18 17:15 ) [12]
Попробовал. Все равно на строке line := Clipboard.AsText выдала ту же ошибку — «Cannot open Clipboard». Да и не думаю я, что это изменение помогло бы, потому что до этого у меня так вот было:
try
line := Clipboard.AsText;
except
raise Exception.Create(«blah-blah-blah»);
end;
← →
VMcL © ( 2004-11-18 17:21 ) [13]
>Думешь, это что-нить даст?
Конечно, не даст. Ведь у меня хобби такое — давать бесполезные советы.
← →
Amoeba © ( 2004-11-18 17:28 ) [14]
Если у тебя в буфере изображение захваченное с экрана, то после
if Clipboard.HasFormat(CF_TEXT) then
строка
line := Clipboard.AsText;
выполняться не будет
и не надо никаких
try
.
except
.
end
Просто нужно проверить формат содержимого Clipboard.
И еще. Так и не последовало никакой реакции на Amoeba © (18.11.04 15:55) [8]
← →
cvg ( 2004-11-18 17:45 ) [15]
Функция OpenClipboard открывает
буфер обмена для проверки и не дает другим
приложениям модифицировать его содержание.
Синтаксис
BOOL OpenClipboard( HWND hWndNewOwner );
Параметры
hWndNewOwner
[in] Дескриптор окна, которое
связывается с открытым буфером обмена.
Если этот параметр имеет значение ПУСТО (NULL),
открытый буфер связан с текущей задачей.
Возвращаемые значения
Если функция завершается успешно,
величина возвращаемого значения — не нуль.
Если функция завершается с ошибкой,
величина возвращаемого значения — нуль.
Чтобы получать дополнительные сведения об
ошибке, вызовите GetLastError.
Замечания
Функция OpenClipboard завершается ошибкой, если
другое окно имеет открытый буфер обмена.
Приложение должно вызвать функцию
CloseClipboard после каждого успешного вызова
OpenClipboard.
Окно, идентифицированное параметром
hWndNewOwner не становится владельцем буфера
обмена, если не вызывается функция EmptyClipboard.
Пример смотри в статье Копирование
информации в буфер обмена.
Смотри также
Обзор Буфер обмена,
CloseClipboard,
EmptyClipboard
Размещение и |
|
Windows. NET Server |
Да |
Windows XP |
Да |
Windows 2000 |
Да |
Windows NT |
Да версии 3.1 и выше |
Windows Me |
Да |
Windows 98 |
Да |
Windows 95 |
Да |
Используемая библиотека |
User32.lib |
Заголовочный файл |
|
— объявлено в |
Winuser.h |
— включено в |
Windows.h |
Unicode |
Нет |
Замечания по |
Не имеется |
Hello Larry, hello white Angel. This might not be a solution for your issues, I would follow Gerards suggestion. But if you want to get an info about your clipboard, you can get access to the clipboard within corel draw via macro.The following simple example pastes any available content into your current document, if the clipboard is empty, a message will appear.
Sub ClipboardData()
If Not Clipboard.Empty Then
ActiveLayer.Paste
Else
MsgBox «There is no data in the clipboard.»
End If
End Sub
Open your VBA Editor and paste this into «GlobalMacrosThisMacroStorage» and press play.
The following example removes any data from the clipboard.
Sub ClipboardClear()
Clipboard.Clear
End Sub
The following example checks to see there is valid data in the clipboard. If there is valid data present, it is pasted into the active layer. If there is no valid data in the clipboard, a message displays in a message box.
Sub ClipboardValid()
If Clipboard.Valid Then
ActiveLayer.Paste
Else
MsgBox «There is no valid data currently in the clipboard.»
End If
End Sub
87 / 66 / 8 Регистрация: 29.09.2009 Сообщений: 425 |
|
1 |
|
Ошибка при чтении данных из буфера обмена01.12.2010, 16:10. Показов 24995. Ответов 9
Доброго вермени суток.На ПК стоит WIN XP SP2. С недавних пор стал замечать что тупит буфер обмена.Т.е. после копирования(файла, текста) недоступен пункт меню «вставить». Ctrl+V тоже не срабатывает(просто ничего не происходит). В Paint попытка «вставить» приводит к ошибке: «Ошибка при чтении даных из буфера обмена». А в DownloadMaster попытка добавить новую закачку приводит к ошибке «Cannot open clipboard». Проблема возникает спонтанно и пока решается перезагрузкой. Кто что может посоветовать уважаемые форумчане? На вирусы проверял касперским, вроде ниче не нашел… 0 |
Почетный модератор 14005 / 3623 / 87 Регистрация: 11.06.2009 Сообщений: 11,783 |
|
01.12.2010, 19:27 |
2 |
попробуйте пообщаться с программкой clipbrd.exe из папки Windows/system32… 2 |
87 / 66 / 8 Регистрация: 29.09.2009 Сообщений: 425 |
|
01.12.2010, 21:25 [ТС] |
3 |
Спасибо, прикольная штука «clipbrd.exe» сколько лет на винде сижу не знал даже. А память проверю, завтра отпишусь. 0 |
Почетный модератор 14005 / 3623 / 87 Регистрация: 11.06.2009 Сообщений: 11,783 |
|
01.12.2010, 21:40 |
4 |
Джуниор, признаюсь по секрету, только -чур никому, лады ? Если бы не Ваш вопрос, я бы тоже не узнал про этот встроенный утиль винды Ну ни к чему было 0 |
magirus |
01.12.2010, 21:41 |
Не по теме:
я бы тоже не узнал про этот встроенный утиль винды я про него уже забыть успел… 0 |
87 / 66 / 8 Регистрация: 29.09.2009 Сообщений: 425 |
|
08.12.2010, 15:20 [ТС] |
6 |
Сообщение было отмечено vavun как решение Решение Сегодня наконец то повторилась проблема, которая описывается выше. Как и посоветовал Almiqui 1 |
32 / 32 / 2 Регистрация: 06.07.2010 Сообщений: 129 |
|
03.01.2012, 23:53 |
7 |
У меня тоже эта проблема наблюдается. Однако нет никакого VIRTUAL PC. Значит не в нем дело. 0 |
680 / 330 / 5 Регистрация: 01.03.2010 Сообщений: 1,387 |
|
04.01.2012, 10:12 |
8 |
1. увеличить файл подкачки 0 |
285 / 201 / 65 Регистрация: 08.11.2010 Сообщений: 1,801 |
|
02.11.2015, 07:59 |
9 |
Была у меня такая проблема недавно, во всем был виноват Скайп. 0 |
1 / 1 / 0 Регистрация: 14.10.2012 Сообщений: 6 |
|
26.02.2016, 18:12 |
10 |
Сегодня наконец то повторилась проблема, которая описывается выше. Как и посоветовал Almiqui Мне этот способ тоже помог . Правда там нет пункта очистить, я там выбрал в меню «Правка», а там «Удалить» — после этого буфер обменв приходит в чувство без перезагрузки компьютера 0 |
Not exactly sure what causes it. It happened when I selected a small area (about 3×10 px) using a circular selection and tried to copy paste it from PixiEditor into paint.net. paint.net also displayed a similar error. Here is the crash log (the crash message says «error while calling openclipboard»):
-------Crash message-------
System.Runtime.InteropServices.COMException: Ошибка при вызове OpenClipboard (0x800401D0 (CLIPBRD_E_CANT_OPEN))
-------Stack trace-------
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode, IntPtr errorInfo)
at System.Windows.Clipboard.Flush()
at System.Windows.Clipboard.CriticalSetDataObject(Object data, Boolean copy)
at System.Windows.Clipboard.SetDataObject(Object data, Boolean copy)
at PixiEditor.Models.Controllers.ClipboardController.CopyToClipboard(Layer[] layers, Coordinates[] selection, Int32 originalImageWidth, Int32 originalImageHeight, SerializableDocument document) in C:Usersegor0sourcereposPixiEditorPixiEditorModelsControllersClipboardController.cs:line 67
at PixiEditor.Models.Controllers.ClipboardController.CopyToClipboard(Document document) in C:Usersegor0sourcereposPixiEditorPixiEditorModelsControllersClipboardController.cs:line 79
at PixiEditor.ViewModels.SubViewModels.Main.ClipboardViewModel.Copy(Object parameter) in C:Usersegor0sourcereposPixiEditorPixiEditorViewModelsSubViewModelsMainClipboardViewModel.cs:line 58
at PixiEditor.ViewModels.SubViewModels.Main.ClipboardViewModel.Cut(Object parameter) in C:Usersegor0sourcereposPixiEditorPixiEditorViewModelsSubViewModelsMainClipboardViewModel.cs:line 40
at PixiEditor.Helpers.RelayCommand.Execute(Object parameter) in C:Usersegor0sourcereposPixiEditorPixiEditorHelpersRelayCommand.cs:line 40
at PixiEditor.Models.Controllers.Shortcuts.Shortcut.Execute() in C:Usersegor0sourcereposPixiEditorPixiEditorModelsControllersShortcutsShortcut.cs:line 42
at PixiEditor.Models.Controllers.Shortcuts.ShortcutController.KeyPressed(Key key, ModifierKeys modifiers) in C:Usersegor0sourcereposPixiEditorPixiEditorModelsControllersShortcutsShortcutController.cs:line 36
at PixiEditor.ViewModels.SubViewModels.Main.IoViewModel.KeyDown(Object parameter) in C:Usersegor0sourcereposPixiEditorPixiEditorViewModelsSubViewModelsMainIoViewModel.cs:line 55
at PixiEditor.Helpers.RelayCommand.Execute(Object parameter) in C:Usersegor0sourcereposPixiEditorPixiEditorHelpersRelayCommand.cs:line 40
at System.Windows.Interactivity.TriggerBase.InvokeActions(Object parameter)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
at System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at System.Windows.Interop.HwndSource.OnPreprocessMessageThunk(MSG& msg, Boolean& handled)
at System.Windows.Interop.ComponentDispatcherThread.RaiseThreadMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run()
at PixiEditor.App.Main()
Произошла исключительная ситуация: Ошибка при вызове OpenClipboard
{InfostartToolkitPROF ОбщийМодуль.ИТК_БуферОбменаКлиент.Модуль(42)}: Возврат htmlfile.ParentWindow.ClipboardData.Getdata("Text");
{InfostartToolkitPROF ОбщийМодуль.ИТК_БуферОбменаКлиент.Модуль(13)}: Если Текст = Текст() Тогда
{InfostartToolkitPROF Обработка.ИТК_КонсольРазработчика.Форма.КодНаВстроенномЯзыке.Форма(204)}: ИТК_БуферОбменаКлиент.Копировать(Текст);
по причине:
Произошла исключительная ситуация: Ошибка при вызове OpenClipboard
Конфигурация:
Бух + Бит.Финанс (3.0.108.36/3.1.51.6)
Основной режим запуска: Управляемое приложение
Режим совместимости: Версия8_3_16
Версия БСП: 3.1.5.306
Клиент:
ОС: Windows x86 (Microsoft Windows 10 version 10.0 (Build 19044))
Язык: ru
Режим запуска: Управляемое приложение
-
Ответить в тему
-
Создать тему
Рекомендованные сообщения
Сергей2014
17
-
- Жалоба
- Рассказать
Всем доброго утро…
Вообщем начало переодически выпадать окно с ошибкой при попытке вставить файл из открытого документа.
Если вставлять через «обзор» — то все нормально. Понимаю что проблема где-то в винде, но где? В остальных программах нормально.
Начала появляться эта ошибка после того как поставил SP5 на SP4 проблем не было.
Изменено 27 января 2016 пользователем Сергей2014
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
SERoz
199
-
- Жалоба
- Рассказать
Подобного не было, но — попробуйте определиться с режимом OpenGl в видяхе…
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
- 3 недели спустя…
Сергей2014
17
- Автор
-
- Жалоба
- Рассказать
Подобного не было, но — попробуйте определиться с режимом OpenGl в видяхе…
не думаю что такое выскакивает из-за видяхи, если бы это из-за нее, то выскакивало бы всегда.
Хотя стоит попробовать.
И что совсем ни у кого такого не было?
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Гость
-
- Жалоба
- Рассказать
Подобного не было, но — попробуйте определиться с режимом OpenGl в видяхе…
Это к видяхе не имеет никакого отношение. Связана скорее с вашим Тулбоксом.
Функция OpenClipboard открывает буфер обмена для проверки и не дает другим приложениям модифицировать его содержание.
Изменено 16 февраля 2016 пользователем katalex-3
- Цитата
Ссылка на сообщение
Поделиться на других сайтах
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже.
Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.
-
Сейчас на странице
0 пользователей
Нет пользователей, просматривающих эту страницу.
-
Сообщения
-
-
Автор:
Kelny · Опубликовано: 7 минут назад
Обычно меню Файл-Свойства и далее Настройки или Суммарная информация — зависит от автора форматок, к некоторым форматкам так же прилагается программа/макрос для изменения данных форматки.
-
Автор:
jtok · Опубликовано: 9 минут назад
Нет значений и мест приложений всех приложенных нагрузок. Может, по 1Н приложили и радуетесь.
-
-
Автор:
Nickro555 · Опубликовано: 41 минута назад
Где искать настрой ки основной надписи чертежа. хочу в шаблоне исправить фамилии? Не могу найти где: &razrab — Фамилия
-
-
Автор:
Kelny · Опубликовано: 46 минут назад
При наличии двух и более экранов вообще не проблема.
Ну и т.к. оно всё равно всё в окне программы настраивается, что видеть даже ни надо ни чего за ним.
Да это понял, что смысл отображать инструменты индивиндуально, а не держать программу постоянно запущенной (но тогда в принципе программе не нужно было бы меню для переходов между модулями).
Хотя если программа постоянно запущена — можно было бы прятать её в трей, а так же следить за действиями пользователя, например по смене документов или выбора ТТ например или редактирвоания основной надписи и предлагать инструменты Брасола без кликов пользователя.
-
Автор:
nicomed · Опубликовано: 49 минут назад
Я не вчитывался, конечно, может там и одна «вода», но гугл по запросу «parasolid api documentation» выдает ссылку : ТЫЦ
Upd: ссылка в PDF-ке «мертвая», но если проявить фантазии то :
ТЫЦ2
Далее по ссылкам не ходил …
Почему следующий код иногда вызывает исключение с содержимым «CLIPBRD_E_CANT_OPEN»:
Clipboard.SetText(str);
Обычно это происходит при первом использовании буфера обмена в приложении, а не после этого.
Robert, 16 сентября 2008 г., 05:50
55
20 062
7
Ответы:
Решено
На самом деле, я думаю, это ошибка Win32 API.
Чтобы установить данные в буфер обмена, вы должны сначала Открой это. Буфер обмена может быть открыт только для одного процесса. Итак, когда вы проверяете, имеет ли другой процесс открытый буфер обмена по любой причине, ваша попытка открыть его потерпит неудачу.
Так уж получилось, что службы терминалов отслеживают буфер обмена, и в более старых версиях Windows (до Vista) вам нужно открыть буфер обмена, чтобы увидеть, что внутри … что в конечном итоге блокирует вас. Единственное решение — дождаться, пока службы терминалов закроют буфер обмена, и повторить попытку.
Однако важно понимать, что это не относится к службам терминалов: это может случиться с чем угодно. Работа с буфером обмена в Win32 — это состояние гигантской гонки. Но, поскольку по замыслу вы должны возиться с буфером обмена только в ответ на ввод данных пользователем, это обычно не представляет проблемы.
Tadmas, 16 сентября 2008 г., 06:21
Это вызвано ошибкой / функцией в буфере обмена служб терминалов (и, возможно, другими вещами) и реализацией буфера обмена .NET. Задержка открытия буфера обмена вызывает ошибку, которая обычно проходит в течение нескольких миллисекунд.
Решение состоит в том, чтобы попробовать несколько раз в цикле и засыпать между ними.
for (int i = 0; i < 10; i++)
{
try
{
Clipboard.SetText(str);
return;
}
catch { }
System.Threading.Thread.Sleep(10);
}
Robert, 16 сентября 2008 г., 07:07
На самом деле может возникнуть другая проблема. Вызов фреймворка (варианты WPF и winform) примерно так (код взят из отражателя):
private static void SetDataInternal(string format, object data)
{
bool flag;
if (IsDataFormatAutoConvert(format))
{
flag = true;
}
else
{
flag = false;
}
IDataObject obj2 = new DataObject();
obj2.SetData(format, data, flag);
SetDataObject(obj2, true);
}
Обратите внимание, что в этом случае SetDataObject всегда вызывается со значением true.
Внутренне это вызывает два вызова win32 api: один для установки данных, а другой для их удаления из вашего приложения, чтобы он был доступен после закрытия приложения.
Я видел несколько приложений (несколько плагинов для Chrome и менеджер загрузок), которые прослушивают событие буфера обмена. Как только сработает первый вызов, приложение откроет буфер обмена для просмотра данных, а второй вызов сброса завершится ошибкой.
Не нашел хорошего решения, кроме как написать свой собственный класс буфера обмена, который использует прямой API Win32 или вызвать setDataObject напрямую с false для хранения данных после закрытия приложения.
Yishai, 30 июля 2012 г., 20:57
Я решил эту проблему для своего собственного приложения, используя собственные функции Win32: OpenClipboard (), CloseClipboard () и SetClipboardData ().
Ниже созданного мной класса-оболочки. Может ли кто-нибудь пожалуйста просмотреть его и скажи, правильно это или нет. Особенно, когда управляемый код работает как приложение x64 (я использую Any CPU в параметрах проекта). Что происходит, когда я подключаюсь к библиотекам x86 из приложения x64?
Спасибо!
Вот код:
public static class ClipboardNative
{
[DllImport("user32.dll")]
private static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll")]
private static extern bool CloseClipboard();
[DllImport("user32.dll")]
private static extern bool SetClipboardData(uint uFormat, IntPtr data);
private const uint CF_UNICODETEXT = 13;
public static bool CopyTextToClipboard(string text)
{
if (!OpenClipboard(IntPtr.Zero)){
return false;
}
var global = Marshal.StringToHGlobalUni(text);
SetClipboardData(CF_UNICODETEXT, global);
CloseClipboard();
//-------------------------------------------
// Not sure, but it looks like we do not need
// to free HGLOBAL because Clipboard is now
// responsible for the copied data. (?)
//
// Otherwise the second call will crash
// the app with a Win32 exception
// inside OpenClipboard() function
//-------------------------------------------
// Marshal.FreeHGlobal(global);
return true;
}
}
Mar, 11 мая 2015 г., 13:45
Я знаю, что это старый вопрос, но проблема все еще существует. Как упоминалось ранее, это исключение возникает, когда системный буфер обмена заблокирован другим процессом. К сожалению, существует множество инструментов для вырезания, программ для создания снимков экрана и инструментов для копирования файлов, которые могут блокировать буфер обмена Windows. Таким образом, вы будете получать исключение каждый раз, когда попытаетесь использовать Clipboard.SetText(str), когда такой инструмент установлен на вашем ПК.
Решение:
Никогда не использовать
Clipboard.SetText(str);
Использовать вместо
Clipboard.SetDataObject(str);
pr0gg3r, 24 августа 2016 г., 16:46
Это случилось со мной в моем приложении WPF. Я получил ошибку OpenClipboard (исключение из HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN)).
Я использую
ApplicationCommands.Copy.Execute(null, myDataGrid);
Решение — сначала очистить буфер обмена
Clipboard.Clear();
ApplicationCommands.Copy.Execute(null, myDataGrid);
Ellix4u, 11 мая 2017 г., 11:36
Используйте версию WinForms (да, использование WinForms в приложениях WPF не вредно), она обрабатывает все, что вам нужно:
System.Windows.Forms.SetDataObject(yourText, true, 10, 100);
Это попытается скопировать ваш текст в буфер обмена, он останется после того, как ваше приложение существует, будет пытаться до 10 раз и будет ждать 100 мс между каждой попыткой.
Ref. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.clipboard.setdataobject?view=netframework-4.7.2#System_Windows_Forms_Clipboard_SetDataObject_System_Object_System_Boolean_System_Int32_System_Int32_System_
Bret, 4 ноября 2020 г., 21:26
Интересные вопросы для изучения
Добрый день!
Есть парсер, который вызывается n-ное кол-во раз из другой фунции:
Dim oIE As Object
Dim oSheet As Excel.Worksheet
Dim jjj As DataObject
Dim wb As Workbook
Set wb = Workbooks(«fs_pars.xlsm»)
Set jjj = New DataObject
Set oIE = CreateObject(«internetexplorer.application»)
oIE.Navigate «с:\temp\» & page_s & «index.html»
Do While (oIE.ReadyState <> 4)
Loop
oIE.Visible = 0
jjj.SetText oIE.document.Body.innertext
jjj.PutInClipboard
Application.DisplayAlerts = False
Set oSheet = wb.Worksheets.add()
oSheet.Name = «Temp»
wb.Worksheets(«Temp»).Activate
wb.Worksheets(«Temp»).Cells.NumberFormat = «@»
wb.Worksheets(«Temp»).Cells(1, 1).Select
wb.Worksheets(«Temp»).Paste
Set jjj = Nothing
oIE.Quit
Set oIE = Nothing
If page_s = «» Then page_s = «1»
End Sub
Он работает, но переодически выдаёт ошибку на строчке jjj.PutInClipboard:
Run-time error ‘-2147221040(800401d0)’:
DataObject:PutInClipboard Ошибка при вызове OpenClipboard
Подскажите в чём ошибка пожалуйста!
I used to be able to use Windows API calls in Excel VBA to set text on the clipboard. But ever since upgrading to 64-bit Office 2013, I cannot. Below is some code that does not error, but it is also not setting any text on the clipboard. Can someone help me test and troubleshoot?
After pasting the code below into a code module in VBA, you can test it in the immediate windows by typing Clipboard_SetData("Copy this to the clipboard.")
and it should set that text on the clipboard and you would be able to paste it into any other application.
(I am using Windows 8, so I cannot use Microsoft Forms or the Data Object to manipulate the clipboard. It does not work properly on Windows 8.)
UPDATE and EDIT: Code below has been corrected and now works properly in 64-bit Excel, thanks to Jason Kurtz’ answer below. If you find this useful, please vote his answer up.
Option Explicit
'Found 64-bit API declarations here: http://spreadsheet1.com/uploads/3/0/6/6/3066620/win32api_ptrsafe.txt
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Sub ClipBoard_SetData(MyString As String)
'32-bit code by Microsoft: http://msdn.microsoft.com/en-us/library/office/ff192913.aspx
Dim hGlobalMemory As LongPtr, lpGlobalMemory As LongPtr
Dim hClipMemory As LongPtr, X As Long
' Allocate moveable global memory.
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
'Debug.Print "GlobalFree returned: " & CStr(GlobalFree(hGlobalMemory))
GoTo OutOfHere
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Sub
End If
' Clear the Clipboard.
X = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
End Sub
asked Sep 7, 2013 at 2:00
BaodadBaodad
2,4252 gold badges38 silver badges39 bronze badges
4
OK, I got it now…
You need to change this line in your version of the code:
Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As String, ByVal lpString2 As String) As LongPtr
To this:
Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
If you step through the code as you had it, you will see that the value of lpGlobalMemory changes when lstrcopy is called. When the types are changed to Any, the value stays the same.
Works for me on windows 7. Hope it works for you!
answered Sep 24, 2013 at 3:50
1
Posting complete code for others.
Tested and working on 32 Bit Versions of Excel 2007, 2010, 2013, 2016
and 64 Bit Excel 2013
All running on Windows 10
'http://stackoverflow.com/questions/14738330/office-2013-excel-putinclipboard-is-different
Option Explicit
#If VBA7 Then
Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr
Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
#Else
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
#End If
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Function ClipBoard_SetData(MyString As String)
#If VBA7 Then
Dim hGlobalMemory As LongPtr, lpGlobalMemory As LongPtr, hClipMemory As LongPtr
#Else
Dim hGlobalMemory As Long, lpGlobalMemory As Long, hClipMemory As Long
#End If
Dim x As Long
' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted. Please contact 14Fathoms."
GoTo OutOfHere2
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted. Please contact 14Fathoms."
Exit Function
End If
' Clear the Clipboard.
x = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard. Please contact 14Fathoms."
End If
End Function
Sub TestCOPYPASTE()
Call ClipBoard_SetData("Hello World " & now())
'Open notepad or in the immediate window and hit control-v
End Sub
answered Feb 19, 2016 at 18:16
michaelfmichaelf
4696 silver badges20 bronze badges
3
I know that this question is now closed, but I prefer this much simpler approach, which will work independently of the architecture. And I like the approach of a single function to either read/write the clipboard.
Function Clipboard(Optional StoreText As String) As String
'PURPOSE: Read/Write to Clipboard
'Source: ExcelHero.com (Daniel Ferry)
Dim x As Variant
'Store as variant for 64-bit VBA support
x = StoreText
'Create HTMLFile Object
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(StoreText)
'Write to the clipboard
.setData "text", x
Case Else
'Read from the clipboard (no variable passed through)
Clipboard = .GetData("text")
End Select
End With
End With
End Function
answered Mar 11, 2022 at 9:46
iDevlopiDevlop
24.9k11 gold badges90 silver badges149 bronze badges
Use the code exactly as shown here:
http://msdn.microsoft.com/en-us/library/office/ff192913.aspx
except insert PtrSafe after Declare for all the API declarations.
The code should be in a module by itself.
Like this:
Option Explicit
Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long
' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If
' Clear the Clipboard.
X = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
End Function
answered Sep 23, 2013 at 6:12
1