2008-10-01 61 views
4

我正在开发与java的屏幕上的键盘。该键盘的每个可能键都有JComponent。当在按钮上检测到鼠标向下时,我想向当前处于焦点的应用程序发送特定的键盘代码。键盘本身在没有装饰的JFrame内,并且始终位于顶部。从java发送键盘事件到任何应用程序(屏幕上的键盘)

我发现Robot类可以用来在本地队列上模拟这些键盘事件。但是,在这种情况下,选择JComponent将意味着在JFrame上收到按键,并且我无法在其他应用程序中收到该按键

如何保持我的屏幕键盘“始终不为关注焦点“?是否有可能使用另一种方法发送按键?

回答

2

显然,唯一的方法是创建一个JNI图层,它将从java转换为本地图层。 Java没有简单的方法来提供这种funcionality。

这可能是一个小的,第三方库的人谁愿意学习JNI一个有趣的概念...

0

在使用机器人类之前,您是否尝试调用本机setfocus()或setactivewindow()函数来移动焦点?

1

我能找到到目前为止,唯一的解决办法,是让每一个键一个JComponent(所以它不能具有焦点),并设置上的JFrame以下属性:使用机器人时

setUndecorated(true); 
    setFocusableWindowState(false); 
    setFocusable(false); 
    enableInputMethods(false); 

现在我可以通过点击键将事件发送到任何聚焦的窗口。唯一的限制是,它似乎只适用于属于同一个虚拟机的Windows,并且根本不能与任何其他系统窗口一起工作。

+0

在windows 10上完美工作,应该是第一个答案,不需要jni – 2017-08-14 18:26:50

0

我不知道有任何方式以独立于操作系统的方式执行此操作。我不知道Windows,但可能会通过X协议与X服务器通话。

3

我发现jnativehook当我试图控制与实际的键盘和鼠标命令的gamebot(以更像“人性化”)。

+0

从JNativeHook的描述来看,它好像是用于*监听键盘和鼠标事件,而不是用于将事件发送到另一个应用程序。 – 2016-06-02 21:36:10