Вы можете использовать SetWindowHookEx. Таким образом вы можете подключить все сообщения клавиатуры, которые отправляются в процесс, и прекратить их доставку (и обрабатывать их в собственном приложении без фокуса, например). Это довольно надежный способ, но некоторые защиты от копирования могут не понравиться.
нормальные шаги:
Создание DLL (должно быть, потому что вам нужно, чтобы загрузить его в другой процесс/адресное пространство), который перехватывает сообщения окна и делает первую фильтрацию. Обычно вы используете какой-то механизм IPC, чтобы получить формулу в свой собственный процесс. Если вы только привязываете сообщения мыши, вы можете использовать сообщения Windows для отправки информации одному скрытому сообщению. Если вы не хотите, чтобы сообщение появилось, вы можете остановить цепочку.
Когда вызов IPC поступает в ваше собственное окно; обрабатывайте его так, как будто вы получили сообщение с клавиатурой. Постарайтесь быть осторожным с фокусом и т.д.
Единственное, что вы не можете поймать таким образом, является ли поведение приложения при попытке изменить зависит от GetAsyncKeyState(). В таком случае вы можете использовать только инъекционную DLL в другое адресное пространство и перехватывать сам вызов, но это взлом на более высоком уровне.
Одно слово совета: при разработке программного обеспечения для подключения окон: экономьте часто, экономьте часто! Если вы допустили ошибку, вы могли бы сбить все множество приложений за один раз ...
Вы пытались использовать e.handled = true в событии keydown? – Alain
@Alain: Что? В сообщении Windows ничего подобного нет. – Puppy
@DeadMG ['System :: Windows :: Forms :: KeyPressEventArgs^e'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx#Y0) '->' [ 'Handled'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.handled.aspx). Вопрос не был достаточно ясным, чтобы исключить возможность его актуальности. – Alain