2014-02-05 4 views
11

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

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

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

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

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

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

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

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

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

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

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

+0

Вы обрабатываете событие вставки самостоятельно в коде? Если да, можете ли вы включить этот метод? –

+0

нет, это очень ваниль. мы полагаемся на встроенный патч winforms textbox – hawbsl

+0

, если машины-разработчики не выдают никаких проблем и делают клиент, очевидно, что-то другое. В [этой теме] (http://social.technet.microsoft.com/Forums/windows/en-US/5bbc11e8-ca2d-41ac-b640-d66ce971f58f/copy-paste-clipboard-issues-not-working?forum= w7itprogeneral) имеются упоминания о инструментах управления системой/памятью, которые спорадически опустошают кеш буфера обмена. Это может быть растяжкой, но эй, кто знает –

ответ

1

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

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

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

+0

РЕШЕННЫЙ! вы были правы ... Я всегда чертовски забываю, что когда возникнет необъяснимое, брандмауэр окажется виновником. – hawbsl

8

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

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

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

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

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

+0

Ханс, спасибо за ваш ответ. исключение потоков было полезно, так как я все больше и больше беспокоился об этом. Также я не знал, что в VB его запекают в любом случае. Так получилось, что это был брандмауэр - см. Ответ Гэрга. – hawbsl

+0

Хм, программы по борьбе с кейлоггерами, которые ставят «брандмауэр» в свое имя, не помогают никому идентифицировать настоящую проблему. –

0

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

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

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

Смежные вопросы