首先必要的:
c++ dll编写与加载
c++ windows平台的Hook
掌握hook与dll编写。
学习jni,因为java原生代码无法监控windows系统消息,因而无法去获取硬件(键盘、鼠标)的消息,也就无法写事件。
这里转载:逝我作者的jni教程:
JNI开发系列①JNI概念及开发流程
JNI开发系列②.h头文件分析
JNI开发系列③C语言调用Java字段与方法
JNI开发系列④C语言调用构造方法
JNI开发系列⑤对象引用的处理
通过jni,你可以把java中的方法以dll动态链接库的方式实现。
代码不贴了,说说思路:
1.java中写一个类,类中一个native方法一个普通方法,去生成.h头文件。
2.c/c++中,按照上面hook文章的流程写好子程,在子程中调用java普通方法。
把java的native方法实现成:调用SetWindowsHookEx去挂hook,然后while(GetMessage(null,0,0,0))来让当前线程进入等待态。
3.注意,这里的实现中,必须使用low-level,也即是
WH_KEYBOARD_LL
而不是WH_KEYBOARD
去填参数。4.上面已经足够了,相当于简单地把东西搬到java去。
更进一步的,建议在java中开多一个线程去调用这个native方法,这样就可以实现不卡主线程去挂全局hook。另外可以写多一个native方法,用PostThreadMessage发送一个WM_QUIT消息给while循环那个线程,让他退出循环。这步基本都是完善些包装而已。
5.通过上面的内容,到这里为止,已经解决这个底层问题---在java中当键盘(鼠标)有输入时触发特定的函数。接下来只需要按照观察者模式思想去把java类改造成事件源-事件监听器-事件对象这一套东西,从系统api级别开始编写含有自定义事件的类就算简单完成了。
网友评论