@kerimol123

Почему не работает замена буфера?

Слова в буфере не заменяются, как исправить код, чтоб все работало?

spoiler
using System;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;

namespace Words
{
    public partial class Form1 : Form
    {
        private List<string> words = new List<string>
        {
            "планета",
            "космос",
            "вселенная",
        };

        public Form1()
        {
            while (true)
            {
                string buffer = Clipboard.GetText().Trim();
                if (buffer.Contains(" "))
                    Console.Write("Этот текст не подходит");
                else
                    for (int i = 0; i < words.Count; i++)
                    {
                        string word = words[i];
                        if (buffer.Substring(0, 3) == word.Substring(0, 3) && buffer.Substring(buffer.Length - 3) == word.Substring(word.Length - 3))
                        {
                            Clipboard.SetText(word);
                            break;
                        }
                    }

                Thread.Sleep(500);
            }
        }
    }
}
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
Потому что строки имутабельны. Для замены подстроки есть метод Replace.
Ответ написан
@mvv-rus
Настоящий админ AD и ненастоящий программист
Так, как вы сделали, приложения для Windows GUI не пишутся. У вас цикл с ожиданием сделан совершенно неправильно.
Обработка всего графического интерфейса в программе (в том числе и буфера обмена) в Windows выполняется одним потоком, через цикл сообщений. А вы этот поток захватили и не отдаете. Возможно, именно поэтому не работает и установка содержимого буфера обмена: ЕМНИП она тоже реализована через сообщения (но точно не помню), а шанс обработать очередь сообщний у вашей программы нет.
Короче, переписывайте цикл чтобы никаких Thread.Sleep в нем не было. Например - добавляйте в форму таймер (System.Windows.Forms.Timer) и переносите вашу обработку буфера обмена в обработчик его события Tick.
А там уже смотрите - работает она, или нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы