SendKeys ::Send, впадает в бешенство

#.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 — это сообщения.