Как заблокировать пользовательский ввод при отправке текста с помощью SendInput

Я использую SendInput (в С#, используя pinvoke) для отправки текста в другое приложение. Как я могу заблокировать пользовательский ввод, чтобы любой текст, который пользователь может ввести, когда работает SendInput, добавлялся после того, как SendInput завершил отправку текста? В настоящее время, если пользователь печатает, когда текст отправляется в целевое приложение, окончательный результат может быть противоречивым. Спасибо.


person Andrea Nagar    schedule 28.08.2010    source источник
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
comment
@Steven: нет, если вы делаете это из того же потока, вы должны использовать BlockInput (true); вызовы SendInput (сколь угодно много); БлокВвод(ложь); Согласно странице MSDN: когда ввод заблокирован, реальный физический ввод с помощью мыши или клавиатуры не повлияет на состояние синхронного ключа очереди ввода (сообщается GetKeyState и GetKeyboardState) и не повлияет на состояние асинхронного ключа (сообщается GetAsyncKeyState). Однако поток, блокирующий ввод, может повлиять на оба этих состояния клавиш, вызвав SendInput. Ни один другой поток не может этого сделать. - person James Manning; 30.08.2010
comment
Похоже, это не решение ОП, но интересно. - person Steven Sudit; 30.08.2010
comment
@Steven: можешь объяснить, почему это не решение ОП? Возможно, я что-то упускаю. - person James Manning; 30.08.2010
comment
Или, возможно, я неправильно понимаю, но похоже, что ее вариант использования включает отправку текста в другой процесс, предотвращая непреднамеренный ввод данных пользователем. Это означало бы, что она не имеет контроля над потоком, ввод которого должен быть заблокирован. - person Steven Sudit; 31.08.2010
comment
@Steven: Насколько я знаю, функции не зависят от процесса, они работают на уровне сеанса, поэтому, насколько мне известно, OP должен нормально работать, просто вызывая BlockInput до и после своих вызовов SendInput. Обратите внимание, что SendInput также говорит о проверке существующего состояния клавиатуры с помощью GetAsyncKeyState, что также может потребоваться OP. - person James Manning; 31.08.2010
comment
Функция не принимает никакого идентификатора потока или процесса, поэтому она может работать только с текущим потоком. - person Steven Sudit; 31.08.2010
comment
Да, для меня дело в том, что я хочу отправить текст в целевое приложение и запретить пользователю вводить текст при отправке текста, чтобы не допустить, чтобы введенный пользователем текст изменил текст, введенный с помощью SendInput. Я думаю, что, вероятно, BlockInput не является правильным решением. Что должно произойти, так это то, что нажатия клавиш, которые пользователь набирает, когда текст отправляется SentInput и воспроизводится, когда автоматическая вставка текста завершена. - person Andrea Nagar; 01.09.2010
comment
Джеймс прав — BlockInput() блокирует все пользовательские данные, кроме SendInput(), когда вызов выполняется в том же потоке; то есть вызовы SendInput() в ДРУГИХ потоках также будут заблокированы вместе с любым обычным пользовательским вводом в ДРУГИХ потоках или процессах того же сеанса. Обратите внимание, что для работы BlockInput() требуется повышение прав. - person Fotios Basagiannis; 22.04.2018