>jna.jar 与 jna-platform.jar
jna-platform封装了一些常见的WIN32平台功能,用于简化常用Native Access的操作;在工程配置上,jna.jar 相当于应用内核,而jna-platform.jar是jna包的插件。
>利用jna-platform.jar快捷地获取句柄并操纵窗口的例子
首先我们需要获取jna-platform:https://github.com/java-native-access/jna
然后我们一并为工程导入jna.jar和jna-platform.jar这两个包。
接下来,我们用jna-platform来实现这样一个例子:获取QQ窗口,若其已隐藏,将其显示;否则输出相关提示信息。
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.platform.win32.WinUser;
public class JNAWIN {
public static void main(String[] args){
String windowName = "QQ";
HWND hwnd = User32.INSTANCE.FindWindow(null,windowName);
if (hwnd==null)System.out.println("Miss!");
else {
System.out.println("Hit!");
boolean showed = User32.INSTANCE.ShowWindow(hwnd, WinUser.SW_RESTORE );
System.out.println(windowName+(showed?"窗口之前可见.":"窗口之前不可见."));
}
}
}//MyBlog @See http://blog.csdn.net/shenpibaipao
public class KeyboardHook implements Runnable{
private WinUser.HHOOK hhk;
//钩子回调函数
private WinUser.LowLevelKeyboardProc keyboardProc = new WinUser.LowLevelKeyboardProc() {
@Override
public LRESULT callback(int nCode, WPARAM wParam, WinUser.KBDLLHOOKSTRUCT event) {
// 输出按键值和按键时间
if (nCode >= 0) {
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println(time + " KEY: " + event.vkCode);
// 按下ESC退出
if(event.vkCode==27) KeyboardHook.this.setHookOff();
}
return User32.INSTANCE.CallNextHookEx(hhk, nCode, wParam, null);
}
};//MyBlog @See http://blog.csdn.net/shenpibaipao
public void run() {
setHookOn();
}
// 安装钩子
public void setHookOn(){
System.out.println("Hook On!");
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
hhk = User32.INSTANCE.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardProc, hMod, 0);
int result;
WinUser.MSG msg = new WinUser.MSG();
while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {
if (result == -1) {
setHookOff();
break;
} else {
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
}
}
}
// 移除钩子并退出
public void setHookOff(){
System.out.println("Hook Off!");
User32.INSTANCE.UnhookWindowsHookEx(hhk);
System.exit(0);
}
}
进行测试:
KeyboardHook kbhook = new KeyboardHook();
new Thread(kbhook).start();
控制台输出: