从零开始的JNA之路(三):利用jna-platform.jar调取窗口及安装键盘钩子

>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();

    控制台输出:

     




评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值