Вставить текстовое поле Winforms ненадежным?

У нас есть стандартное текстовое поле в приложении Winforms, которое отвечает на вставку (как правой кнопкой мыши, так и CTRL+V) обычным способом (то есть вставкой) в нашей среде разработки.

На одном сайте клиента вставка в основном полностью игнорируется (ведет себя так, как будто в буфере обмена ничего нет). Мы протестировали его как с однострочными, так и с многострочными версиями TextBox, и мы создали отдельное приложение, содержащее всего пару TextBox, и на этом одном клиентском сайте проблема сохраняется. Вставка в основном не работает.

В дальнейшем тестировании мы обнаружим, что, просто запрашивая содержимое буфера обмена в тестовом приложении winforms, оно возвращается в виде пустой строки. Двойная проверка с помощью Блокнота, мы находим, что в буфере обмена что-то есть.

Вот что мы проверили:

  • В тестах мы проверяем источник буфера обмена из Блокнота или даже внутри самого текстового поля, поэтому мы знаем, что это не что-то странное из HTML/Word
  • Мы всегда можем ввести в текстовое поле, так что это не так, как будто текстовое поле не допускает изменения
  • Количество текста, которое мы пробовали с большим и малым количеством текста в буфере обмена, не имеет значения
  • Вставка правой кнопкой мыши по сравнению с CTRL + V: они либо работают, либо не работают, поэтому все те сообщения, которые посвящены исправлению того или другого, нам не помогут
  • В поисках шаблонов я думаю, что если он не работает, он не работает снова, пока приложение не будет перезапущено, но я не уверен
  • Когда проблема с вставкой возникает, обрезка и копирование остаются без изменений и продолжают работать
  • Функция вставки машин клиента определенно работает с другими приложениями, Блокнотом, Офисом и т. Д.

Помните, что одно и то же скомпилированное приложение всегда успешно вставляется на наши машины разработки и иногда успешно вставляется на машины клиента! Вот что делает его таким загадочным.

Во всех случаях мы убедились, что что-то есть в буфере обмена, вставив его в Блокнот вместе с нашим приложением.

Кто-нибудь еще видел это и / или может предложить объяснение?

Обновление / Дальнейшее расследование
Может быть, это связано с многопоточностью? Мы не делаем ничего интересного с потоками, и нам никогда не приходилось беспокоиться об использовании атрибута STAThread. Но на странице MSDN написано:

Класс Clipboard может использоваться только в потоках, настроенных на однопотоковый режим (STA). Чтобы использовать этот класс, убедитесь, что ваш метод Main помечен атрибутом STAThreadAttribute.

Итак, в проекте Winforms без основного потока - просто форма запуска, куда вы помещаете этот атрибут? И почему нам это не нужно на машинах разработчиков? И почему у нас никогда не было необходимости использовать его в любом из множества других приложений Winforms, которые мы сделали?

3 ответа

Решение

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

Это не мешает писать; Смысл этой функции заключается в том, чтобы не дать вредоносным программам украсть важную информацию, которая может попасть в буфер обмена, например пароль.
Он также может блокировать любое заданное приложение от выполнения других системных задач, например, создания снимка экрана или перехода на веб-страницу с помощью системного браузера по умолчанию.

У клиента может быть что-то подобное, с разрешенным в правилах блокнотом.

Вы даете очень мало, чтобы пройти. Весьма маловероятно, что это вызвано проблемой в вашей программе, гораздо более вероятно, что это экологическая проблема, характерная для компьютера пользователя.

Некоторый фон. Элемент управления TextBox в приложении Winforms - это тот же компонент, который используется Блокнотом для редактирования текста. Базовым нативным компонентом является элемент управления "Правка", он является стандартным компонентом в Windows с версии 1.0. Обратите внимание, что контекстное меню, которое вы получаете, когда вы щелкаете правой кнопкой мыши TextBox и Блокнот, идентично. Не существует различий между командой "Вставить" в этом меню и нажатием Ctrl+V, они оба вызывают отправку сообщения WM_PASTE в собственный элемент управления "Редактировать". Что внутренне связано с буфером обмена, этот код полностью за пределами вашей досягаемости и работает так же в блокноте, как и в вашей программе.

Проблема с квартирами потоков маловероятна, у клиента также должна быть проблема с командой "Копировать", и вы должны были заметить это раньше. В C# это устанавливается атрибутом [STAThread] метода Main(), это генерируется компилятором в VB.NET.

Существует множество утилит, которые могут привести к неправильной работе буфера обмена. Прежде всего, это программы просмотра буфера обмена, программы, которые подключаются к уведомлениям буфера обмена. AddClipboardFormatListener() является базовой функцией winapi. Они имеют тенденцию делать что-то вроде "улучшения" буфера обмена, позволяя ему хранить более одного элемента или давать другое представление о том, что находится в буфере обмена. Они имеют тенденцию дестабилизировать машину, не передавая уведомления следующему зрителю должным образом или нарушая цепочку зрителя, не отменяя правильную регистрацию. Такая разорванная цепь сама по себе ведет к тому, что "работает нормально в блокноте, а не в моем".

Такие проблемы, конечно, очень трудно диагностировать, и обычно они не решаются до тех пор, пока пользователь компьютера полностью не очистит свою машину. То, что это его проблема, а не ваша, всегда трудно доставить, не может вам в этом помочь.

Иногда возможно, что другое стороннее приложение управляет вашим буфером обмена, например Snagit, возможно, что сторонние приложения имеют свои фильтры для буфера обмена для стандартных элементов управления, таких как блокнот и другие приложения на базе Windows.

Что вы можете сделать, так это выяснить, что любое другое приложение на компьютере клиента имеет доступ к буферу обмена. Вы можете проверить через диспетчер задач или запущенный процесс. Это может помочь вам.

Я столкнулся с подобной проблемой с приложением Snagit. Это приложение мешало моей программе устанавливать текст буфера обмена для их собственного использования.

Другие вопросы по тегам