>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();
控制台输出: