注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

韩国恺的博客

hanguokai.com

 
 
 

日志

 
 

Java捕获系统全局的键盘事件  

2010-12-05 23:36:55|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们常用的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不鼓励的,也不能跨平台。
使用 JNA (Java Native Access, https://jna.dev.java.net/  )可以实现这点,按照其示例实现一个LowLevelKeyboardProc 的hook安装到系统来捕获底层的键盘事件。
  评论这张
 
阅读(4044)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018