既然已经这么久了,我正在创建一个新的答案。我做了研究,我很确定我知道发生了什么。但在得出结论之前,我将提及我检查过的所有官方资源。
可能的打包解决方案
首先,新的Windows 输入模拟器可能会立即解决您的所有问题。如果您需要我将在下面讨论的 Windows API,请先检查PInvoke.net以查看他们是否有您尝试进行的调用的文档。
Windows API 方式
最好的起点是 MSDN 上的用户交互文章。那里有一堆新的 Winu8 Touch API,但您可能对旧版键盘输入文章感兴趣。
应用程序的每个窗口都必须有一个Windows 过程(又称Window 持有的资源。此过程还负责处理来自输入设备的消息,例如鼠标单击和键盘上的键。WindowsProc
WM_QUIT
在您的情况下,您更感兴趣的是让 Window 认为没有来自键盘的消息。这就是SendInput
API 调用的用途;它允许您将一系列INPUT
消息(无论是键盘、鼠标还是其他输入设备)直接插入队列,而无需用户进行实际操作。这个简单的 API 调用专门接受MOUSEINPUT
、KEYBDINPUT
或HARDWAREINPUT
消息。
对于键盘,当一个键被按下 ( WM_KEYDOWN
) 和它被释放 ( WM_KEYUP
) 时,您会收到一条消息,因此要确定像 那样的热键CTRL+C
,您必须查看在键a 之后但之前收到WM_KEYDOWN
的字母的消息它的信息。C
WM_KEYDOWN
CTRL
WM_KEYUP
管理输入设备消息
要模拟输入设备,请使用SendInput
将WM_KEYDOWN
和/或WM_KEYUP
消息传递给目标窗口。但不要忘记,一个应用程序可以有多个窗口。有 API 调用来获取不同的 Windows,但是在你可以使用它之前,你需要编写代码来找到它SendInput
。a
要了解窗口对输入设备的看法,请使用GetAsyncKeyState
. 如果您干预了与输入设备相关的 API,您可能无法信任它。
有BlockInput
一个窗口调用,它拒绝所有消息,除了SendInput
来自阻止它的线程的调用。在大多数情况下,尽快重新启用输入是正确的。文档说,如果阻塞线程死亡,BlockInput
则被禁用。一个类似但不那么苛刻的调用是EnableWindow
阻止窗口接收输入焦点。
Windows 的 API 包括注册钩子的能力,它允许您指定消息的种类和/或某些要由用户指定的函数查看的窗口。