#.net #c -cli #infinite-loop #freeze #sendkeys
#.net #c -cli #бесконечный цикл #заморозить #sendkeys
Вопрос:
Я пытаюсь внести обновления в два связанных TextBox
эс. Я отключаю события в одном, а затем отправляю нажатия клавиш, используя, например SendKeys::Send("A");
, сначала сфокусировав его:
texBox2->Focus();
texBox2->KeyDown -= gcnew KeyEventHandler(this, amp;Form1::texBox2_KeyDown);
SendKeys::Send("A");
texBox2->KeyDown = gcnew KeyEventHandler(this, amp;Form1::texBox2_KeyDown);
Это почти работает, но вместо этого становится совершенно безумным, повторяя символ (я не смею проверять, какой именно ключ, потому что я отчаянно борюсь с переполнением), пока я не нажму control-alt-del. Никакие другие клавиши не оказывают никакого эффекта, и мышь зависает. Но диспетчер задач чудесным образом восстанавливает мой контроль, я ничего не останавливаю и не убиваю из него.
Может кто-нибудь посоветовать? Отладчик зависает на этом SendKeys::Send("A");
утверждении.
Ответ №1:
SendKeys
помещает ввод в очередь сообщений, которая ставится в очередь и поэтому будет обработана после повторного подключения событий. Отсюда и странность.
Мой совет — прекратить использовать SendKeys
для обновления содержимого ваших собственных элементов управления. Просто измените содержимое текстовых полей напрямую.
Комментарии:
1. Прямое изменение больших неизменяемых строк вызывает мерцание, я нашел метод SendWait более перспективным. Я установил точку останова в каждом обработчике, и она не нарушала их во время «бесконечного» цикла.
2. Предполагая, что это WinForms, вы можете дешево добавлять символы с помощью Windows api, используя WM_SETSEL, я думаю. Для этого может быть .net-способ. Переназначение всей строки плохо, но SendKeys хуже. Используйте WM_SETSEL — мой главный совет здесь.
3. Но насколько вы правы. Еще больше странностей после первоначального удовлетворения ожиданием отправки. Весь экран (а не только текстовые поля) мерцает, и если я удерживаю нажатой клавишу, он выглядит неуместным, поскольку я обновляю второй программно. Хотя никаких массивных циклов 🙂 Спасибо за совет WM_SETSEL, Дэвид
4. на самом деле EM_SETSEL и EM_REPLACESEL — это сообщения.