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

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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 КБ Просмотры: 144
  • 28,1 КБ Просмотры: 150
  • 31,5 КБ Просмотры: 115
  • 29,7 КБ Просмотры: 109
  • 29,7 КБ Просмотры: 91
  • 31 КБ Просмотры: 109
  • 32,4 КБ Просмотры: 96
  • 29,2 КБ Просмотры: 105
  • 32,2 КБ Просмотры: 83

Phoenix78

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

eee

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

eee

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

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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 КБ Просмотры: 122
  • 42,6 КБ Просмотры: 104
  • 45,9 КБ Просмотры: 100
  • 46,9 КБ Просмотры: 87
  • 45,6 КБ Просмотры: 89
  • 41,1 КБ Просмотры: 86
  • 51,3 КБ Просмотры: 67
Последнее редактирование:
  • Спасибо
Реакции: kagorec

Phoenix78

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

eee

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

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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 КБ Просмотры: 79
  • 41,3 КБ Просмотры: 86
  • 47,6 КБ Просмотры: 84
  • 44,5 КБ Просмотры: 88
  • 42,8 КБ Просмотры: 85
  • 47,1 КБ Просмотры: 74
  • 50,9 КБ Просмотры: 68
  • 39 КБ Просмотры: 69

Phoenix78

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

78991


78992


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

eee

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

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

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

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

eee

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

volody00

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

volody00

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

eee

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

Вложения

volody00

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

Phoenix78

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

BAZAg

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

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

Phoenix78

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

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

BAZAg

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

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 689
Баллы
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 760
Благодарностей
2 398
Баллы
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
Сообщения
793
Благодарностей
811
Баллы
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 760
Благодарностей
2 398
Баллы
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 790
Благодарностей
5 689
Баллы
113
этот вариант тоже не работает. хз в чем там дело. во всех инстанстах, иногда пролетает то что было в буфере, до старта потоков.

79005


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

volody00

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

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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 КБ Просмотры: 71
  • 37 КБ Просмотры: 68
  • 43,8 КБ Просмотры: 64
  • 38,7 КБ Просмотры: 63
  • 39,4 КБ Просмотры: 60
  • 40,6 КБ Просмотры: 54

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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
Сообщения
209
Благодарностей
113
Баллы
43
Ну, системный буфер обмена по определению однопоточный, когда туда что-то скопировали - старая инфа удаляется. В Windows 10 появилась история буфера обмена, но не уверен что это можно использовать в зеннопостере
 

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
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]
 

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