Меню

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

Автор:

Sergi2 · Опубликовано: 5 часов назад

Доброго дня, коллеги, вышла из строя карта памяти SRAM/FROM.  После замены залил Бэкап с флеш карты из режима IPL,  теперь просит сертификацию (ошРС5523), обращался в FANUC,  они ответили:

 с 18.04.2022 и вплоть до поступления соответствующих распоряжений со стороны FANUC CORPORATION, ООО “ФАНУК” приостанавливает осуществление следующих активностей на территории Российской Федерации

—        поставка на территорию РФ и отгрузка заказчикам и клиентам ООО “ФАНУК” всей линейки продукции производства FANUC CORPORATION;

—        поставка на территорию РФ и отгрузка заказчикам и клиентам ООО “ФАНУК” любых запчастей (в том числе предоплаченных) к ранее поставленной на территорию РФ продукции производства FANUC CORPORATION;

—        оказание сервисного, технического и гарантийного обслуживания ранее поставленной на территорию РФ продукции производства FANUC CORPORATION;

Все перечисленные авансы в адрес ООО «ФАНУК» по заключенным договорам и выставленным счетам, но не отгруженным на данный момент, подлежат обязательному возврату по первому требованию с подписанием соответствующих дополнительных соглашений о расторжении договоров и получении письма-запроса на возврат, оформленного в соответствии с существующими требованиями.

В мануалах про сертификацию ничего нет, единственная ссылка, что необходимо обратиться в FANUC. Прошу откликнуться, mail:  kam.tch@mail.ru, заранее благодарю.

Доброго времени суток.
Я тут работаю с буфером обмена.
Так, как Clipboard.SetText(<Текст>) отказывается работать (COMException) то пришлось писать свой велосипед:

unsafe public static class Clipboard
{
    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    private static extern int OpenClipboard(
        IntPtr hWndNewOwner
    );

    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    private static extern int CloseClipboard();

    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    private static extern int EmptyClipboard();

    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr GetClipboardData(
        uint uFormat
    );

    [DllImport("User32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr SetClipboardData(
        uint uFormat,
        IntPtr hMem
    );

    [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr GlobalLock(
        IntPtr hMem
    );

    [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
    private static extern int GlobalUnlock(
        IntPtr hMem
    );

    [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr GlobalAlloc(
        uint uFlags,
        ulong dwBytes
    );

    [DllImport("msvcrt", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    private static extern int wcscpy(char* str1, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder str2);

    private const uint CF_TEXT = 1;
    private const uint GMEM_DDESHARE = 8192;

    public static void SetText(string strText)
    {
        if (OpenClipboard(IntPtr.Zero) != 0)
        {
            IntPtr hgBuffer;
            char* chBuffer;
            EmptyClipboard();
            hgBuffer = GlobalAlloc(GMEM_DDESHARE, 2 * Convert.ToUInt64(strText.Length + 1)); // 2 = sizeof(wchar_t) -- C++; sizeof(char) -- C#
            chBuffer = (char*)GlobalLock(hgBuffer);
            wcscpy(chBuffer, new StringBuilder(strText));
            GlobalUnlock(hgBuffer);
            SetClipboardData(CF_TEXT, hgBuffer);
            CloseClipboard();
        }
    }

    public static string GetText()
    {
        if (OpenClipboard(IntPtr.Zero) != 0)
        {
            IntPtr hData = GetClipboardData(CF_TEXT);
            char* chBuffer = (char*)GlobalLock(hData);
            string strResult = new string(chBuffer);
            GlobalUnlock(hData);
            CloseClipboard();
            return strResult;
        }
        return "";
    }
}

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

alt text

Как это можно исправить?

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

Почему следующий код иногда вызывает исключение с содержимым «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

Интересные вопросы для изучения

kostenko

ЗАБАНЕН!
Сообщения: 50
Зарегистрирован: 18 окт 2010, 22:10

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

Привет! Помогите пожалуйста! Когда я копирую что либо во флеше(Ctrl+C) или просто (выделяю объект и нажимаю на нем правой мышкой и нажимаю Copy) то оно выдает ошибку в виде «Ошибка при вызове Openclipboard». Подскажите как это исправить?
СпасибО!

Аватара пользователя

bodnar

Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Ошибка при вызове Openclickboard

Сообщение

bodnar » 21 ноя 2010, 06:45

Такое всегда было или внезапно появилось?
Попробуй отключить периферийные устройства (планшет etc)
Перезагрузи комп и не открывай ничего кроме флеша.Заработало?
Попробуй переустановить.

Код C#:

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 < 100;i++)
  {
     try
     {
        Clipboard.Clear();
        textBox.SelectAll();
        textBox.Copy();                      
        return;
     }
     catch (Exception ex)
     {
        System.Threading.Thread.Sleep(100);
     }
  }
}

Подскажите плиз, как можно побороть эту проблему.

23.09.09 00:25: Перенесено модератором из ‘.NET’ — TK

Здравствуйте, Кирилл Осенков, Вы писали:

КО>[STAThread] на точке входа стоит?

WPF по умолчанию выполняется в [STAThread].

А>WPF по умолчанию выполняется в [STAThread].
Прошу прощения, коллега, мой телепатический модуль сейчас в ремонте. Без него мне неясно, используется ли в исходном сообщении WinForms или WPF.

Кроме того можно посоветовать привести полный mixed-mode call stack для главного потока с загруженными символами. Интересно, что происходит в native code frames, может поймать native first chance exception до того, как оно HRESULT вернёт и отмотает стек.

Здравствуйте, serjik007, Вы писали:

S>ошибка при вызове OpenClipboard(Исключение из HRESULT: 0x800401D0(CLIPBRD_E_CANT_OPEN))»


S>Получается Clipboard занят другим процессом и удается до него достучаться.

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

S>Подскажите плиз, как можно побороть эту проблему.

Код твой вставил в WPF приложение прямо в конструктор Windows1, где он и сработал без проблем. Дело не в коде. Судя по всему , у тебя что-то именно с клипбоард не то. Проверь работу ее вручную, то есть забрось туда какой-нибудь текст и убедись, что он там есть.

Если некоторое приложение вызвало OpenClipboard и не вызвало CloseClipboard, clipboard будет недоступна всем другим приложениям.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Paint tool sai ошибка не удалось сохранить холст
  • Paint tool sai выдает ошибку недостаточно памяти