Эксперимент по выявлению пересечений буфера обмена при работе в многопотоке

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
Столкнулся в своем проекте с пересечением содержимого буфера обмена и решил оценить размер проблемы. Эксперимент состоит во вставке числа равного номеру потока в течение 250 циклов. Браузер: Chrome, версия ZP: 7.4, число потоков: 10. Используется C# код вставки из буфера обмена взятый где-то на форуме:
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    var textcr = project.Variables["article_title"].Value;
    System.Windows.Forms.Clipboard.SetText(textcr);
    instance.ActiveTab.KeyEvent("v","press","ctrl");//вставить текст из переменной
}
Результаты: как мы видим результаты очень неутешительные (а при увеличении числа потоков вероятность пересечения буфера обмена несомненно увеличивается). Надо что-то с этим делать.
 

Вложения

  • 29,4 КБ Просмотры: 196
  • 28,1 КБ Просмотры: 193
  • 31,5 КБ Просмотры: 163
  • 29,7 КБ Просмотры: 159
  • 29,7 КБ Просмотры: 134
  • 31 КБ Просмотры: 156
  • 32,4 КБ Просмотры: 141
  • 29,2 КБ Просмотры: 153
  • 32,2 КБ Просмотры: 131

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
Тебе не кажется, что вставляя какие то данные в ОБЩИЙ буфер обмена, после всех операций надо восстанавливать те данные, что ты ЗАТЕР этим методом ?
Ищи лучше, был на форуме нормальный код, который сохранял данные что были в буфере. у тебя вообще неработоспособный к многопотоку кусок кода приведен.
потом, 100% инфа, что использовать буфер обмена вообще нафиг не нужно, во все элементы все прекрасно вставляется. Лучше потрать время на изучение как работать с элементами, а не тестирование ненужной функциональности.
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
Тебе не кажется, что вставляя какие то данные в ОБЩИЙ буфер обмена, после всех операций надо восстанавливать те данные, что ты ЗАТЕР этим методом ?
Ищи лучше, был на форуме нормальный код, который сохранял данные что были в буфере. у тебя вообще неработоспособный к многопотоку кусок кода приведен.
потом, 100% инфа, что использовать буфер обмена вообще нафиг не нужно, во все элементы все прекрасно вставляется. Лучше потрать время на изучение как работать с элементами, а не тестирование ненужной функциональности.
Для Яндекс Дзена так никто и не нашел решения кроме как использования ctrl+v. Ну и еще в studio.youtube.com без него не обойтись. А так конечно бы не связывался с этим.
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
Код от [Дон шампиньон] в Chrome отработал еще хуже. + в проект попадает содержимое cистемного буфера

[Дон шампиньон] https://zennolab.com/discussion/threads/snippet-vstavki-iz-bufera-obmena-dlja-zennoposter-mnogopotochnyj-s-blokirovkami-don-shampinon.33359/:
lock(SyncObjects.InputSyncer) // блокировка
{
    var descr = project.Variables["content"].Value;

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

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

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

Вложения

  • 116,5 КБ Просмотры: 184
  • 42,6 КБ Просмотры: 153
  • 45,9 КБ Просмотры: 142
  • 46,9 КБ Просмотры: 129
  • 45,6 КБ Просмотры: 136
  • 41,1 КБ Просмотры: 130
  • 51,3 КБ Просмотры: 113
Последнее редактирование:
  • Спасибо
Реакции: kagorec

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
Для Яндекс Дзена так никто и не нашел решения кроме как использования ctrl+v. Ну и еще в studio.youtube.com без него не обойтись. А так конечно бы не связывался с этим.
в каком месте яндекс дзена ?
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
В результате 3-го теста, уже в браузере FF52x64 (!) наилучшие результаты показал код от Дона Шампиньона! Нет пересечений буфера обмена в многопотоке, но(!) есть пересечения с системным буфером ((( В итоге решил работать с этим кодом в браузере FF52x64:
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    var descr = project.Variables["content"].Value;

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

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

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

Вложения

  • 48,4 КБ Просмотры: 125
  • 41,3 КБ Просмотры: 142
  • 47,6 КБ Просмотры: 131
  • 44,5 КБ Просмотры: 135
  • 42,8 КБ Просмотры: 134
  • 47,1 КБ Просмотры: 121
  • 50,9 КБ Просмотры: 105
  • 39 КБ Просмотры: 118

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
в редакторе статьи
ну что там сложного ?
вот структура редактора, все логические элементы видны. структуру нужного дива легко добавить в родительский элемент, обычным добавлением элемента или же можно тупо через изменение html родителя.

78991


78992


не согласен с утверждением , что никто не нашел решения. Вот то что не выложили на форуме, это может быть.
Да тут и выкладывать нечего, кто хоть немного поработает с элементами спокойно все сделает.
 
  • Спасибо
Реакции: eee

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
ну что там сложного ?
вот структура редактора, все логические элементы видны. структуру нужного дива легко добавить в родительский элемент, обычным добавлением элемента или же можно тупо через изменение html родителя.

Посмотреть вложение 78991

Посмотреть вложение 78992

не согласен с утверждением , что никто не нашел решения. Вот то что не выложили на форуме, это может быть.
Да тут и выкладывать нечего, кто хоть немного поработает с элементами спокойно все сделает.
я очень долго копался но у меня ничего не получалось. он вставлять вставляет, но при публикации текст нарисованный экшеном "set"пропадает
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
однако в FF52x64 мой проект не работает. печально что такая классная программа по факту во многих проектах становится бесполезной из-за таких вот ньюансов. Если бы разработчики добавили бы рабочий метод блокировки буфера обмена в ZP то это оправдало бы ожидания многих клиентов.
 

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
93

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
93
Хотя нет, скинь все таки полностью шаблон на котором тесты проводил. Гляну после 12:00
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
для теста нужен собственный сайт с wordpress.
 

Вложения

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
93
  • Спасибо
Реакции: eee

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
Значит глянул я этот шаблон и код. Погонял в зенке.
В общем как я и писал выше, этот метод с использованием буфера обмена не пригоден. По одной простой причине, что установка значений в этот буфер обмена не гарантирована. Я выставил паузы перед/после каждой операции с буфером , смог уйти от пересечения между потоками, но все равно иногда пролетает старый текст который был до запуска этих шаблонов. А так как там код простой, то вывод только один, буфер не реагирует на смену значений.
Просто не надо использовать то, что не предназначено для многопотока и все будет хорошо.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
113
Любой код не поможет, если речь о том, что в буфер обмена будет писать кто-угодно кроме единственного шаблона, в котором стоит лок на буфер. Другими словами - если шаблон работает не на сервере, а Вы сами сидите и что-то копируете в буфер - будьте готовы к тому, что в буфере может быть что угодно в любой конкретный момент.

Коды, по работе с буфером предназначены для тех, кто не пользуется компьютером - а отдаёт его (например сервер) на ростерзание шаблону Зенно.
 
  • Спасибо
Реакции: baracuda и Lord_Alfred

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
Любой код не поможет, если речь о том, что в буфер обмена будет писать кто-угодно кроме единственного шаблона, в котором стоит лок на буфер. Другими словами - если шаблон работает не на сервере, а Вы сами сидите и что-то копируете в буфер - будьте готовы к тому, что в буфере может быть что угодно в любой конкретный момент.

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
113
я запускал в 5 потоков, ничего не трогал, не копировал. и все равно пролетали данные из буфера не те. буфер обмена не устанавливает новые данные, иногда. вот это иногда портит всю малину.
Так ничего не мешает добавить данные в буфер (в локе).
Потом прочитать данные оттуда (не выходя с лока).
Проверить, что получили в результате (совпадает ли хеш строки, например).
Если не совпадает - повторять в цикле до тех пор, пока данные туда не зайдут.

Я говорю о том, что сколько мы бы не лочили кодом буфер ничего не помешает нажать на клавиатуре Ctrl + C и перезаписать этот буфер своими данными.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
Так ничего не мешает добавить данные в буфер (в локе).
Потом прочитать данные оттуда (не выходя с лока).
Проверить, что получили в результате (совпадает ли хеш строки, например).
Если не совпадает - повторять в цикле до тех пор, пока данные туда не зайдут.

Я говорю о том, что сколько мы бы не лочили кодом буфер ничего не помешает нажать на клавиатуре Ctrl + C и перезаписать этот буфер своими данными.
не помогает.
я уже там накатал говно код, и он не может установить данные. и проверки не помогают. ничего не помогает, ни лок ни паузы, ни повторы, ни повторное считывание. НИЧЕГО. Тупо не надо его использовать и все.
C#:
lock (CommonCode.SyncObject_buff) // блокировка
{
    var descr = project.Variables["article_title"].Value;

    Thread.Sleep(160);
    
    // сохраняем предыдущее состояние буфера
    String previous_text = "";
    previous_text = System.Windows.Forms.Clipboard.GetText();

    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(descr);

     Thread.Sleep(320);
    
    for (int i = 0; i<10; i++)
    {
        var temp = System.Windows.Forms.Clipboard.GetText();
        if (temp == descr)
        {
            instance.ActiveTab.KeyEvent("v", "press", "ctrl");
            temp = System.Windows.Forms.Clipboard.GetText();
            if (temp != descr)
            {
                project.SendInfoToLog($"После вставки, В буфере {temp}, вместо {descr}", true);
            }
            break;
        }else
        {
            Thread.Sleep(320);
            System.Windows.Forms.Clipboard.SetText(descr);
            project.SendInfoToLog($"Перед вставкой В буфере {temp}, вместо {descr}", true);
            instance.ActiveTab.KeyEvent("v", "press", "ctrl");
        
        }
    }

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
113
не помогает.
я уже там накатал говно код, и он не может установить данные. и проверки не помогают. ничего не помогает, ни лок ни паузы, ни повторы, ни повторное считывание. НИЧЕГО. Тупо не надо его использовать и все.
C#:
lock (CommonCode.SyncObject_buff) // блокировка
{
    var descr = project.Variables["article_title"].Value;

    Thread.Sleep(160);
   
    // сохраняем предыдущее состояние буфера
    String previous_text = "";
    previous_text = System.Windows.Forms.Clipboard.GetText();

    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(descr);

     Thread.Sleep(320);
   
    for (int i = 0; i<10; i++)
    {
        var temp = System.Windows.Forms.Clipboard.GetText();
        if (temp == descr)
        {
            instance.ActiveTab.KeyEvent("v", "press", "ctrl");
            temp = System.Windows.Forms.Clipboard.GetText();
            if (temp != descr)
            {
                project.SendInfoToLog($"После вставки, В буфере {temp}, вместо {descr}", true);
            }
            break;
        }else
        {
            Thread.Sleep(320);
            System.Windows.Forms.Clipboard.SetText(descr);
            project.SendInfoToLog($"Перед вставкой В буфере {temp}, вместо {descr}", true);
            instance.ActiveTab.KeyEvent("v", "press", "ctrl");
       
        }
    }

    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
    Thread.Sleep(160);
   
}
Хм... Странно, мне не получилось на 500 потоках поймать ошибку.
Но... Правда когда пришлось остановить этих 500 потоков, то оказалось что это потребует не мало времени (закрыл Зенно).
Вот реально не понимаю, в чём именно проблема?
Код который использовал для проверки добавил ниже.
79002


C#:
string line = Guid.NewGuid().ToString();
string md5 = line.GetMD5Hash();
string new_md5_1 = string.Empty;
string old_clip = string.Empty;
string new_md5_2 = string.Empty;
int item = 0;
lock (SyncObjects.InputSyncer) {
    old_clip = System.Windows.Forms.Clipboard.GetText().Trim();
    while(md5 != new_md5_1) {
        item++; // Счётчик попыток добавления в буфер
           try {
            System.Windows.Forms.Clipboard.Clear();
            System.Windows.Forms.Clipboard.SetText(line);
            new_md5_1 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
        }
        catch {
            project.SendWarningToLog("Ошибка добавления данных в буфер",true);
            Thread.Sleep(100);
        }
    }
    
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
    
    new_md5_2 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
    
    System.Windows.Forms.Clipboard.Clear();
    if(!string.IsNullOrEmpty(old_clip)) System.Windows.Forms.Clipboard.SetText(old_clip);
}

 var outer = System.Threading.Tasks.Task.Factory.StartNew(() => {
        if(md5==new_md5_1&& new_md5_1 ==new_md5_2) project.SendInfoToLog(string.Format("{0} {1} {2} {3}", md5, new_md5_1, new_md5_2, item),true);
        else project.SendWarningToLog(string.Format("{0} {1} {2} {3}", md5, new_md5_1, new_md5_2, item),true);
    });
 
  • Спасибо
Реакции: eee и volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
93
@eee , Пользуйся кодом от @BAZAg , он работает без ошибок. Я оттуда вырезал кое-что, вставь в свой проект в таком виде (во время работы шаблона нельзя пользоваться ctrl+c на клавиатуре):

C#:
string line = project.Variables["article_title"].Value;
string md5 = line.GetMD5Hash();
string new_md5_1 = string.Empty;
string old_clip = string.Empty;
string new_md5_2 = string.Empty;
int item = 0;
lock (SyncObjects.InputSyncer) {
    while(md5 != new_md5_1) {
        item++; // Счётчик попыток добавления в буфер
           try {
            System.Windows.Forms.Clipboard.Clear();
            System.Windows.Forms.Clipboard.SetText(line);
            new_md5_1 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
        }
        catch {
            project.SendWarningToLog("Ошибка добавления данных в буфер",true);
            Thread.Sleep(100);
        }
    }
    
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
    
    new_md5_2 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
    
    System.Windows.Forms.Clipboard.Clear();
}
@BAZAg , можешь подсказать, почему такая проверка не работает корректно? Я сам пробовал делать так, но при такой реализации будут проскакивать левые числа.

C#:
lock(CommonCode.SyncObject) // блокировка
{
    var descr = project.Variables["article_title"].Value;

    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(descr);
    
    for(int j=0;j<100;j++)
    {
        string pr = System.Windows.Forms.Clipboard.GetText();
        if(pr==descr) break;
        Thread.Sleep(50);
    }
    Thread.Sleep(100);
    instance.ActiveTab.KeyEvent("v","press","ctrl");
    
//    //очищаем буфер
    System.Windows.Forms.Clipboard.Clear();
    
    //проверяем очистился ли
    for(int i=0;i<100;i++)
    {
        string previous_text = System.Windows.Forms.Clipboard.GetText();
        if(String.IsNullOrEmpty(previous_text))
        {
            break;
        }
        Thread.Sleep(50);
    }
}
 
  • Спасибо
Реакции: eee и BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
113
@eee , Пользуйся кодом от @BAZAg , он работает без ошибок.
Не факт, что работает без ошибок - проверять надо.
Я запускал потоки без браузера, и возможно, что мой тест не корректный, так как в без браузерных потоках не понятно как именно обрабатывает инструкция instance.ActiveTab.KeyEvent("v","press","ctrl");
К сожалению, изучать данный вопрос более тщательно нет времени.

@BAZAg , можешь подсказать, почему такая проверка не работает корректно?
Если речь о pr==descr - сравнивал хеши потому, что предполагал, что возможно в каждой из переменных по 65000 символов - если строки поменьше - сравнение должно отрабатывать быстрее/менее ресурсоемко (это мне так кажется, не замерял).

Если речь о string.IsNullOrEmpty(previous_text) - то я банально не знаю что именно устанавливает System.Windows.Forms.Clipboard.Clear(); - вдруг он туда какой-то null подставляет или ещё какие-то байты/метки - из-за чего хеши и здесь должны были решить эту проблему.

Кстати, я не уверен, но мне кажется, что любую работу с буфером (вызов любого метода) стоит одевать в try/catch...

Кстати, а если за for(int j=0;j<100;j++) 100 попыток не установило значение - то не стоит продолжать работу (всёравно ведь данные не те что надо) - может там какое-то исключение бросать...
 
  • Спасибо
Реакции: eee и volody00

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 726
Баллы
113
этот вариант тоже не работает. хз в чем там дело. во всех инстанстах, иногда пролетает то что было в буфере, до старта потоков.

79005


Да тупо буфер обмена не предназначен для таких целей, вот и все. Надо использовать методы которые есть в зенке и не городить ерунды.
 
  • Спасибо
Реакции: BAZAg

volody00

Client
Регистрация
06.09.2016
Сообщения
978
Благодарностей
1 067
Баллы
93
у меня код Bazag в 10 потоков работает без ошибок (остальные варианты работали некорректно). тс потестит, отпишется
 
  • Спасибо
Реакции: eee

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
@eee , Пользуйся кодом от @BAZAg , он работает без ошибок. Я оттуда вырезал кое-что, вставь в свой проект в таком виде (во время работы шаблона нельзя пользоваться ctrl+c на клавиатуре):

C#:
string line = project.Variables["article_title"].Value;
string md5 = line.GetMD5Hash();
string new_md5_1 = string.Empty;
string old_clip = string.Empty;
string new_md5_2 = string.Empty;
int item = 0;
lock (SyncObjects.InputSyncer) {
    while(md5 != new_md5_1) {
        item++; // Счётчик попыток добавления в буфер
           try {
            System.Windows.Forms.Clipboard.Clear();
            System.Windows.Forms.Clipboard.SetText(line);
            new_md5_1 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
        }
        catch {
            project.SendWarningToLog("Ошибка добавления данных в буфер",true);
            Thread.Sleep(100);
        }
    }
   
    instance.ActiveTab.KeyEvent("v", "press", "ctrl");
   
    new_md5_2 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash();
   
    System.Windows.Forms.Clipboard.Clear();
}
volody00 что-то совсем куча мала с этим вариантом
 

Вложения

  • 41,4 КБ Просмотры: 113
  • 37 КБ Просмотры: 117
  • 43,8 КБ Просмотры: 110
  • 38,7 КБ Просмотры: 107
  • 39,4 КБ Просмотры: 106
  • 40,6 КБ Просмотры: 92

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
сейчас затестю код от @Phoenix78
C#:
       lock (CommonCode.SyncObject_buff) // блокировка
{
var descr = project.Variables["article_title"].Value;

Thread.Sleep(160);

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

// сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(descr);

Thread.Sleep(320);

for (int i = 0; i<10; i++)
{
var temp = System.Windows.Forms.Clipboard.GetText();
if (temp == descr)
{
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
temp = System.Windows.Forms.Clipboard.GetText();
if (temp != descr)
{
project.SendInfoToLog($"После вставки, В буфере {temp}, вместо {descr}", true);
}
break;
}else
{
Thread.Sleep(320);
System.Windows.Forms.Clipboard.SetText(descr);
project.SendInfoToLog($"Перед вставкой В буфере {temp}, вместо {descr}", true);
instance.ActiveTab.KeyEvent("v", "press", "ctrl");

}
}

// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
Thread.Sleep(160);

}
 

Geograph

Client
Регистрация
16.02.2014
Сообщения
207
Благодарностей
114
Баллы
43
Ну, системный буфер обмена по определению однопоточный, когда туда что-то скопировали - старая инфа удаляется. В Windows 10 появилась история буфера обмена, но не уверен что это можно использовать в зеннопостере
 

eee

Client
Регистрация
04.06.2018
Сообщения
136
Благодарностей
31
Баллы
28
сейчас затестю код от @Phoenix78
C#:
       lock (CommonCode.SyncObject_buff) // блокировка
{
var descr = project.Variables["article_title"].Value;

Thread.Sleep(160);

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

// сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(descr);

Thread.Sleep(320);

for (int i = 0; i<10; i++)
{
var temp = System.Windows.Forms.Clipboard.GetText();
if (temp == descr)
{
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
temp = System.Windows.Forms.Clipboard.GetText();
if (temp != descr)
{
project.SendInfoToLog($"После вставки, В буфере {temp}, вместо {descr}", true);
}
break;
}else
{
Thread.Sleep(320);
System.Windows.Forms.Clipboard.SetText(descr);
project.SendInfoToLog($"Перед вставкой В буфере {temp}, вместо {descr}", true);
instance.ActiveTab.KeyEvent("v", "press", "ctrl");

}
}

// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
Thread.Sleep(160);

}
Хотя не получается запустить . Выдает ошибку
Компиляция кода Ошибка в действии "CS0103" "The name 'CommonCode' does not exist in the current context". [Строка: 3; Cтолбец: 7]
 

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