2010年12月20日星期一

国内搜索引擎提交网站入口

新域名、新网站还没被搜索引擎收录,那就主动提交一下网址吧。常用的各大搜索引擎都有提交网站的入口:

谷歌(Google) : http://www.google.com/addurl/?hl=zh-CN&continue=/addurl

新网站被收录的速度都比较慢,不同搜索引擎收录更新的快慢也差很多。

2010年12月5日星期日

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

我们常用的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安装到系统来捕获底层的键盘事件。

Java为什么会死

我承认有点标题党,准确的说应该是“Java程序为什么会退出”,自己随便总结几条,欢迎大家补充。
  • 调用了System.exit
  • 所有非后台线程运行结束或异常退出
  • 线程内有没有捕获的异常,抛到了最外层,线程推出。如一个简单的main程序,出现一个未捕获的异常,程序就退了。但在GUI程序中一般不会,因为窗口线程总在。
  • 遇到各种致命error,内存方面问题常见的是 OutOfMemoryError,影响整个jvm,导致退出。
  • 无线递归导致线程堆栈溢出 StackOverflowError ,只影响该线程。
  • 界面死锁,程序没反应。程序没有退出,但这时也只能kill掉了