Сниппет вставки из буфера обмена для ZennoPoster (многопоточный, с блокировками) [Дон шампиньон]

Решение для многопотока:


lock(SyncObjects.InputSyncer) // блокировка потока
{
string text = project.Variables["Your_Text"].Value;

// сохраняем текущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();

// сохраняем объедененный вами ранее текст в буфер производим действие {CTRL+V}
System.Windows.Forms.Clipboard.SetText(text);
instance.ActiveTab.KeyEvent("v","press","ctrl");

// чистим буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
А это уже просто скопированный первый пост...
 
  • Спасибо
Реакции: kagorec
Выдано предупреждение за хамское поведение.
Решение для многопотока:


lock(SyncObjects.InputSyncer) // блокировка потока
{
string text = project.Variables["Your_Text"].Value;

// сохраняем текущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();

// сохраняем объедененный вами ранее текст в буфер производим действие {CTRL+V}
System.Windows.Forms.Clipboard.SetText(text);
instance.ActiveTab.KeyEvent("v","press","ctrl");

// чистим буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
Почему код крашится и вводит иногда пустоту, в многопотоке ?

118233

118234
 
Расставьте паузы.
А лучше синхронизируйте действие между потоками путем записи в ТХТ файл состояний работы со сниппетом, это исключает эту ошибку.
А именно добавив перед кодом вставки запись в файл, после удалите записи из файла, для того чтобы следующий поток занял состояние занятости. Но перед кодом добавьте проверку на состояние занятости потока.:cl:
 
100% способ вставки из переменной:

string textToPaste = project.Variables["text"].Value;
System.Windows.Forms.Clipboard.SetText(textToPaste);
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
Используйте это решение с логикой представленной выше.
 
А лучше синхронизируйте действие между потоками путем записи в ТХТ файл состояний работы со сниппетом, это исключает эту ошибку.
А именно добавив перед кодом вставки запись в файл, после удалите записи из файла, для того чтобы следующий поток занял состояние занятости. Но перед кодом добавьте проверку на состояние занятости потока.:cl:
паузы... файл... состояние занятости *HAHA*

А вы можете просто выложить рабочий код, для многопотока, а не вот это все непотребство ?
 
  • Спасибо
Реакции: Dr.Pipetka
Выдано предупреждение за хамское поведение.
Выдано предупреждение за хамское поведение.
сколько пафоса от человека, который просто скопировал->вставил код из поста
И от форума, на котором сниппет с ошибкой существует больше 5ти лет.
 

Вложения

  • det9m.png
    det9m.png
    34,8 KB · Просмотры: 34
Пример в котором вместо сниппета на вставку сохраняется профиль.
 
У кого проблемы с кодом, попробуйте этот вариант:
C#:
Развернуть Свернуть Копировать
lock(SyncObjects.InputSyncer)
{
    var descr = project.Variables["content"].Value;
    if(descr == "")
    {
        //return -1; // Если надо выти по зеленой в случае пустой переменной
        throw new Exception("Переменная для вставки из буфера пуста!"); // Если надо выти по красной в случае пустой переменной
    }
   
    // Сохраняем ВСЕ данные из буфера обмена (не только текст)
    System.Windows.Forms.IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject();
    var previousData = new System.Windows.Forms.DataObject();
    foreach (var format in dataObject.GetFormats())
    {
        previousData.SetData(format, dataObject.GetData(format));
    }
   
    // Сохраняем нужный текст в буфер обмена
    System.Windows.Forms.Clipboard.SetText(descr);
   
    // Вставляем текст с помощью комбинации клавиш "Ctrl+V"
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
   
    // Очищаем буфер обмена
    System.Windows.Forms.Clipboard.Clear();
   
    // Восстанавливаем ВСЕ предыдущие данные в буфер обмена
    foreach (var format in previousData.GetFormats())
    {
        System.Windows.Forms.Clipboard.SetData(format, previousData.GetData(format));
    }
}
В бою не проверял, но пару ошибок должно убрать.
 
У кого проблемы с кодом, попробуйте этот вариант:
C#:
Развернуть Свернуть Копировать
lock(SyncObjects.InputSyncer)
{
    var descr = project.Variables["content"].Value;
    if(descr == "")
    {
        //return -1; // Если надо выти по зеленой в случае пустой переменной
        throw new Exception("Переменная для вставки из буфера пуста!"); // Если надо выти по красной в случае пустой переменной
    }
  
    // Сохраняем ВСЕ данные из буфера обмена (не только текст)
    System.Windows.Forms.IDataObject dataObject = System.Windows.Forms.Clipboard.GetDataObject();
    var previousData = new System.Windows.Forms.DataObject();
    foreach (var format in dataObject.GetFormats())
    {
        previousData.SetData(format, dataObject.GetData(format));
    }
  
    // Сохраняем нужный текст в буфер обмена
    System.Windows.Forms.Clipboard.SetText(descr);
  
    // Вставляем текст с помощью комбинации клавиш "Ctrl+V"
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
  
    // Очищаем буфер обмена
    System.Windows.Forms.Clipboard.Clear();
  
    // Восстанавливаем ВСЕ предыдущие данные в буфер обмена
    foreach (var format in previousData.GetFormats())
    {
        System.Windows.Forms.Clipboard.SetData(format, previousData.GetData(format));
    }
}
В бою не проверял, но пару ошибок должно убрать.
между проектами работает?
 
все равно встречаются вилки с буфером обмена.
единственный верный вариант кодом, это генерировать виртуальный буфер обмена для каждого инстанса и работать с ним отдельно.
 
Выдано предупреждение за неприемлемое поведение.
Вилка одновременной сработки сниппета во время работы нескольких проектов с буфером обмена, буфер есть лишь один и точка.
Ой бля, иди в притоне дальше неси хуйню.
 
Ах. Вот если бы существовал какой-то механизм, с помощью которого можно было бы формировать очередь на доступ к каким-то ресурсам...
Ага, напрмер лок) lock(SyncObjects.InputSyncer)
 
  • Спасибо
Реакции: Pierre Paul Jacques и doc
Ах. Вот если бы существовал какой-то механизм, с помощью которого можно было бы формировать очередь на доступ к каким-то ресурсам...
Этим механизмом являетесь вы)
 
  • Спасибо
Реакции: Pierre Paul Jacques
  • Спасибо
Реакции: Pierre Paul Jacques
Привет, у меня тоже такая беда:
Изолировать буфер обмена на несколько потоков, чтобы избежать смешивания данных?

Если вы нашли решение, пожалуйста, не могли бы вы ответить здесь на русском языке?
или в моем английском посте
:

Большое спасибо
 
В свое время тоже мучатся с этим дрочем. В конечном итоге, проект переписал на Post\Get, т.к. это единственный адекватный вариант.
 
Последнее редактирование:
С вставкой из буфера работал шаблон хорошо но периодически буфер переплетался.
Сделал в итоге вставку в форму по старинке в textarea не по value, а по innertext
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)