Я использую SendInput (в С#, используя pinvoke) для отправки текста в другое приложение. Как я могу заблокировать пользовательский ввод, чтобы любой текст, который пользователь может ввести, когда работает SendInput, добавлялся после того, как SendInput завершил отправку текста? В настоящее время, если пользователь печатает, когда текст отправляется в целевое приложение, окончательный результат может быть противоречивым. Спасибо.
Как заблокировать пользовательский ввод при отправке текста с помощью SendInput
comment
Какой пользовательский ввод? Из консольного приложения, приложения Windows или веб-сайта?
- person Ronald Wildenberg   schedule 28.08.2010
Ответы (1)
Похоже, вы ищете BlockInput?
http://msdn.microsoft.com/en-us/library/ms646290(VS.85).aspx
person
James Manning
schedule
28.08.2010
@Steven: нет, если вы делаете это из того же потока, вы должны использовать BlockInput (true); вызовы SendInput (сколь угодно много); БлокВвод(ложь); Согласно странице MSDN: когда ввод заблокирован, реальный физический ввод с помощью мыши или клавиатуры не повлияет на состояние синхронного ключа очереди ввода (сообщается GetKeyState и GetKeyboardState) и не повлияет на состояние асинхронного ключа (сообщается GetAsyncKeyState). Однако поток, блокирующий ввод, может повлиять на оба этих состояния клавиш, вызвав SendInput. Ни один другой поток не может этого сделать.
- person James Manning; 30.08.2010
Похоже, это не решение ОП, но интересно.
- person Steven Sudit; 30.08.2010
@Steven: можешь объяснить, почему это не решение ОП? Возможно, я что-то упускаю.
- person James Manning; 30.08.2010
Или, возможно, я неправильно понимаю, но похоже, что ее вариант использования включает отправку текста в другой процесс, предотвращая непреднамеренный ввод данных пользователем. Это означало бы, что она не имеет контроля над потоком, ввод которого должен быть заблокирован.
- person Steven Sudit; 31.08.2010
@Steven: Насколько я знаю, функции не зависят от процесса, они работают на уровне сеанса, поэтому, насколько мне известно, OP должен нормально работать, просто вызывая BlockInput до и после своих вызовов SendInput. Обратите внимание, что SendInput также говорит о проверке существующего состояния клавиатуры с помощью GetAsyncKeyState, что также может потребоваться OP.
- person James Manning; 31.08.2010
Функция не принимает никакого идентификатора потока или процесса, поэтому она может работать только с текущим потоком.
- person Steven Sudit; 31.08.2010
Да, для меня дело в том, что я хочу отправить текст в целевое приложение и запретить пользователю вводить текст при отправке текста, чтобы не допустить, чтобы введенный пользователем текст изменил текст, введенный с помощью SendInput. Я думаю, что, вероятно, BlockInput не является правильным решением. Что должно произойти, так это то, что нажатия клавиш, которые пользователь набирает, когда текст отправляется SentInput и воспроизводится, когда автоматическая вставка текста завершена.
- person Andrea Nagar; 01.09.2010
Джеймс прав — BlockInput() блокирует все пользовательские данные, кроме SendInput(), когда вызов выполняется в том же потоке; то есть вызовы SendInput() в ДРУГИХ потоках также будут заблокированы вместе с любым обычным пользовательским вводом в ДРУГИХ потоках или процессах того же сеанса. Обратите внимание, что для работы BlockInput() требуется повышение прав.
- person Fotios Basagiannis; 22.04.2018