我们常用的QQ、MSN程序有一个Idle功能,也就是当用户一段时间没有任何鼠标、键盘事件的时候自动把用户状态设为离开,有事件的时候自动设为在线。
鼠标可以通过 MouseInfo.getPointerInfo() 得到当前的鼠标位置,判断鼠标的位置有没有变化。
那么Java如何捕获系统全局的键盘事件呢?
1. Java可以捕获自身GUI中某个组件上或全局的整个java程序上发生的键盘事件。
捕获整个java程序上发生的键盘事件:
方法一:Toolkit.getDefaultToolkit().addAWTEventListener( listener, eventMask)
listener是回调函数
eventMask是要关注的事件,如果只关注键盘事件,填 AWTEvent.KEY_EVENT_MASK 就可以
方法二:替换默认实现的EventQueue(事件队列),覆盖dispatchEvent方法,增加键盘处理。
EventQueue e = Toolkit.getDefaultToolkit().getSystemEventQueue();
e.push(new EventQueue() {
@Override
protected void dispatchEvent(AWTEvent event) {
if (event instanceof KeyEvent) {
// do your code
}
super.dispatchEvent(event);
}
});
如果Java程序处于当前操作系统的焦点,就可以捕获到所有键盘事件。
2. 但是Java本身是无法捕获Java之外的键盘事件的,也就是你无法知道在其它程序上发出的键盘事件。没办法,Java的设计就是这样。在一般的受管环境下,如 .net 一般也是只能捕获自己的键盘事件,而不是系统全局的hook,不过网上倒是有一篇文章介绍使用C#捕获全局系统键盘的办法。
唯一的办法就是使用native的方式捕获系统底层的键盘事件。当然这是Java不鼓励的,也不能跨平台。