我正在编写一个小脚本,使用鼠标键可以节省一些时间。我可以正确正确地使用鼠标键。但是,当使用java.awt.Robot
和java.awt.event.KeyEvent
时,鼠标键实际上被忽略,而是由程序按文字键。
如果程序要调用robot.keyPress(KeyEvent.VK_MULTIPLY)
并且启用了鼠标键,则程序将输出星号,而不是像手动执行操作那样将Numpad 5键更改为右键单击。
这是故意的吗?如果是这样,为什么Java不支持此功能,或更具体地说,为什么不支持java.awt
?
编辑:从轻松访问中心引用Windows鼠标键
最佳答案
根据java.awt.Robot Javadoc“事件在平台的本机输入队列中生成”。轻松访问中心相关程序(如MouseKeys和Magnifier等)的实现很可能是在user-land级别上完成的(基于_MOUSEKEYS struct
上的this page表示在)。如果启用了MouseKeys,我想它会先通过Mouse事件将键盘事件替换为Mouse事件,然后再通过WinUser.h
function将它们发送到低级队列。
MouseKeys不直接监视低级输入队列,它仅在窗口管理器级别运行,并用合成的鼠标移动输入代替用户键盘输入。 MouseKeys实现永远不会直接与操作系统最低级别的输入队列进行交互,而这些队列是由内核本身管理的。由于SendInput
类将事件直接插入到低级队列中,因此它在“ MouseKeys”程序的输入挂钩“下方”进行操作。 MouseKeys没有接收到任何按键,因此它什么也不做,但是按键输入直接放置在低级队列中,因此您仍然可以看到按键输出。
请注意,该答案主要基于有根据的推测,但我认为该答案几乎可以肯定是正确的。总而言之:MouseKeys程序旨在监视用户的输入,而不监视来自所有来源的低级输入。当Robot
类在低级MouseKeys上创建综合输入时,将忽略Robot
类输入。