У нас есть стандартное текстовое поле в приложении Winforms, которое отвечает на вставить (как контекстное меню, так и CTRL + V) обычным способом (то есть, пасты) в нашей среде разработки.
На одном сайте клиента паста в основном полностью игнорируется (ведет себя так, как будто в буфере обмена ничего нет). Мы протестировали его как с однострочными, так и с многострочными версиями TextBox, и мы создали автономное приложение только с несколькими текстовыми блоками, и на этом одном клиентском сайте проблема сохраняется. Вставка в основном не работает.
В дальнейшем тестировании мы обнаруживаем, что просто запрашиваем содержимое буфера обмена в тестовом winforms приложении, оно возвращается как пустая строка. Двойная проверка с помощью Блокнота мы находим там определенно что-то в буфере обмена.
Здесь мы проверили:
- В тестах мы гарантируем, что источник буфера обмена находится в Notepad или действительно внутри самого текстового поля, поэтому мы знаем, что это не что-то странное из HTML/Word
- Мы всегда можем вводить текст в текстовое поле, так что это не так, как если бы текстовое поле не позволяло изменять
- Количество текста Мы пробовали его с большим и небольшим количеством текста в буфере обмена, не имеет значения
- Правая кличка по сравнению с CTRL + V: они либо работают, либо не работают, поэтому все те сообщения, которые находятся на пути к исправлению того или другого, нам не помогают
- Поиск шаблонов Я думаю, что если он не сработает, когда он не будет работать снова, пока приложение не будет перезапущено, но я не уверен
- Когда проблема с пастой возникает, вырезать и копировать не влияют и продолжают работать
- Функция вставки клиентских машин определенно работает с другими приложениями, "Блокнотом", "Офис" и т.д.
Помните, что одно и то же скомпилированное приложение всегда успешно вставляется в наши dev-машины и иногда успешно вставляется на клиентские машины! Это то, что делает его настолько загадочным.
Во всех случаях мы проверили, что есть что-то в буфере обмена, вставляя в блокнот вместе с нашим приложением.
Кто-нибудь еще видел это и/или может предложить объяснение?
Обновление/Дальнейшее исследование
Может быть, это что-то связано с потоками? Мы не делаем ничего интересного в потоковом режиме, и нам никогда не приходилось беспокоиться об использовании атрибута STAThread. Но на странице MSDN говорится:
Класс Clipboard может использоваться только в потоках, установленных в одну цепочку (STA). Чтобы использовать этот класс, убедитесь, что ваш основной метод отмечен атрибутом STAThreadAttribute.
Итак, в проекте Winforms без основного потока - просто форма запуска, где вы помещаете этот атрибут? И почему нам это не нужно на dev-машинах? И почему нам никогда не приходилось использовать его в любом из бесчисленных других приложений Winforms, которые мы создали?