С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105

Clipboard.SetText: при повторном вызове генерируется ExternalException

20.09.2012, 23:56. Показов 8399. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть кусок кода следующего вида:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
SendInputClass.HoldKeyAsInput(Keys.Control);   //Удерживание клавиши
SendInputClass.SendKeyAsInput(Keys.C);                      //Нажатие клавиши
SendInputClass.ReleaseKeyAsInput(Keys.Control);           //Отпускание клавиши
 
//string translate(string) - производит преобразование текста, какое не важно
String text = translate(Clipboard.GetText(TextDataFormat.Text)); //Проблема в этой строчке
if (text != "")
{
    Clipboard.SetText(text.Trim());
    SendInputClass.HoldKeyAsInput(Keys.Control);
    SendInputClass.SendKeyAsInput(Keys.V);
    SendInputClass.ReleaseKeyAsInput(Keys.Control);
}
Посылает активному окну, в котором выделен текст, нажатие Ctrl+С - т.е. копирует текст в буфер обмена.
Далее считывает текст, преобразовывает и записывает обратно в буфер. Далее окну посылается нажатие Ctrl + V и текст вставляется на место выделенного.

А проблема в следующем: при первом вызове все работает отлично, но при повторных (не перезапуская приложение) генерируется ExternalException следующего вида:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{System.Runtime.InteropServices.ExternalException (0x800401D0): Сбой при выполнении запрошенной операции с буфером обмена.
   в System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
   в System.Windows.Forms.Clipboard.GetDataObject(Int32 retryTimes, Int32 retryDelay)
   в System.Windows.Forms.Clipboard.GetDataObject()
   в System.Windows.Forms.Clipboard.GetText(TextDataFormat format)
   в Clicker_sharp.Form1.WndProc(Message& m) в c:\Dropbox\проекты\Translater\Clicker_sharp\Form1.cs:строка 82
   в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.Run(Form mainForm)
   в Clicker_sharp.Program.Main() в c:\Dropbox\проекты\Translater\Clicker_sharp\Program.cs:строка 19
   в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   в System.Threading.ThreadHelper.ThreadStart()}
Причем если поочередно отключать каждый из трех частей (Ctrl+C, translate, Ctrl+V), все работает замечательно. Проблемы возникают когда программно используется Ctrl+C и считывание из буфера, причем именно во второй раз и далее. Сразу при запуске все работает.

Clipboard.Clear() не помогает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.09.2012, 23:56
Ответы с готовыми решениями:

Clipboard.SetText() отображает предыдущие скопированные данные
Добрый) Суть проблемы: Есть webControl (Awesomium), в нём открывается страница html. Мне необходимо скопировать с неё строку и...

Ошибка при повторном вызове другой формы: ObjectDisposedException
Пытаюсь вызвать другую форму посредством From2 f2 = new From2(); f2.Show(); В другой форме кнопка закрывающая вторую форму,...

Ошибка при повторном вызове метода Clipboard.SetDataObject
Необходимо программно отправить текст в текстовое поле стороннего приложения. Задавал вопрос в разделе C++ WinAPI...

7
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 26
19.03.2014, 11:34
Здравствуйте, помогите разобраться со следующей проблемой.

Когда я в методе Main выполняю операцию:
C#
1
2
Clipboard.SetText("Text"); 
Console.WriteLine(Clipboard.GetText());
все отлично работает.

но когда я запускаю метод из сторонней библиотеки, который делает тоже самое действие. У меня возникает ошибка:
System.Runtime.InteropServices.ExternalE xception: Сбой при выполнении запрошенной операции с буфером обмена.
0
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
19.03.2014, 11:46
positron, может быть дело в том, что буфер обмена заполнен и поэтому туда можно что-то поместить только после его очистки?
0
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 26
23.03.2014, 21:28
После долгих проб пришел к выводу, дело не в том, что запускаю из сторонней библиотеки. Проблема в чем-то другом.

если я в своем приложении выполняю Clipboard.SetText("text");
затем в стороннем приложении с помощью winapi нажимаю на кнопку, которая копирует текстовую строку в буфер. и я пытаюсь словить ее в своем приложении с помощью Clipboard.GetText();
тут же происходит ошибка (System.Runtime.InteropServices.External Exception: Сбой при выполнении запрошенной операции с буфером обмена.)

но если я в своем приложении не выполняю Clipboard.SetText("text"), а сразу копирую в стороннем приложении;
тогда все работает нормально.

Кто-то сталкивался с таким? может знает причины или способ решения)
спасибо)
0
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
24.03.2014, 11:31
Посмотри здесь, может, поможет:
Исключение при работе с буфером обмена
0
0 / 0 / 0
Регистрация: 30.04.2013
Сообщений: 26
25.03.2014, 09:30
quakeer, спасибо. это пробовал. не помогло(
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
10.09.2015, 00:07
Апну старую тему, ибо возникла аналогичная проблема, а причины, по которой это происходит, пока не нашел. Если кто что знает-отпишитесь.
0
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 5
20.05.2020, 18:39
У меня тоже вылетало такое исключение. Причиной оказался Punto Switcher.

Добавлено через 36 минут
Если не охота закрывать пунто каждый раз, то решение такое:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
        private static void ClipboardSetText(string text)
        {
            bool exception = false;
            do
            {
                exception = false;
 
                try
                {
                    Clipboard.SetText(text);
                }
                catch (Exception)
                {
                    exception = true;
                }
 
            } while (exception);
        }
 
        private static string ClipboardGetText()
        {
            string result = null;
 
            bool containsText = false;
            bool exception = false;
            do
            {
                exception = false;
 
                try
                {
                    containsText = Clipboard.ContainsText();
                }
                catch (Exception)
                {
                    exception = true;
                }
            } while (exception);
 
            if (containsText)
            {
                do
                {
                    exception = false;
 
                    try
                    {
                        result = Clipboard.GetText();
                    }
                    catch (Exception)
                    {
                        exception = true;
                    }
                } while (exception);
            }
 
            return result;
        }
При включенном пунто вызов метода подвисает на пару секунд, но зато имеем ожидаемый результат.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2020, 18:39
Помогаю со студенческими работами здесь

Ошибка при вызове метода setText
Если первый setText в func() закоментить, то работает, иначе аварийное завершение программы с исключением. Что тут не так то может быть?...

При повторном вызове функции MessageBox не появляется
Доброго времени суток. Возникла проблема с MessageBox При первом вызове все работает нормально. Но при повторном вызове ф-ции...

Access violation при повторном вызове компонента
Lazarus IDE v1.0.12 fpc 2.6.2 Ubuntu 13.10 i386 Создал визуальный компонент на основе TTreeView с динамической подгрузкой ветвей...

Форма ожидания не появляется при повторном вызове
Есть код: private void OnSampleClick(object sender, EventArgs args) { Waiting dlg = new Waiting(); ...

Почему clipboard.settext(str) копирует текст в буфер обмена без абзацев?
Почему clipboard.settext(str) копирует текст в буфер обмена без абзацев? Например, я скопировал текст в textbox через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru