KeyboardPianoV1.8 Debug(Unhook)


详细步骤

例行说明

V1.3.1 BUG 记录 中写到,使用 Hook 钩子函数拦截系统按键信息,并屏蔽系统按键,导致一个问题,只要程序运行着,即使程序最小化,系统也无法正常按键,所以这个版本将修正该 BUG

具体步骤

  • 当程序窗口获得焦点时,启用钩子函数监听系统按键
  • 反之,当程序窗口失去焦点时,取消监听屏蔽,恢复系统按键

代码分析

  • KeyboardPiano

    1. implements WindowFocusListener
      override windowGainedFocus() & windowLostFocus()

    2. setHookOn() 当窗口获得焦点时,启动钩子函数
      setHookOff() 当窗口失去焦点时,取消钩子函数

KeyboardHook keyboardHook = new KeyboardHook(this);
JFrame.addWindowFocusListener(new WindowFocusAdapter);

private class WindowFocusAdapter implements WindowFocusListener {

	@Override
	public void windowGainedFocus(WindowEvent e) {
		// TODO Auto-generated method stub
		if(keyboardHook != null && !keyboardHook.isFocused && 
				window.frmKeyboardpiano.isFocused()) {
			keyboardHook.setHookOn();
		}
	}

	@Override
	public void windowLostFocus(WindowEvent e) {
		// TODO Auto-generated method stub
		if(keyboardHook != null && keyboardHook.isFocused &&
				!window.frmKeyboardpiano.isFocused()) {
			keyboardHook.setHookOff();
		}
	}

}
  • KeyboardHook

    1. setHookOn() => 启动 Hook 线程 HookThread => setHookOnInner() 启动钩子函数并获取系统信息
    2. setHookOff() => User32.INSTANCE.UnhookWindowsHookEx(hhk); 关闭钩子
public boolean isFocused = false;

private void setHookOnInner() {
	if(hhk == null) {
		HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
		hhk = User32.INSTANCE.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardProc, hMod, 0);
	} else {
		return;
	}
	isFocused = true;
	WinUser.MSG msg = new WinUser.MSG();
	/*
	 * GetMessage is a blocking thread, it calls callback?
	 */
	User32.INSTANCE.GetMessage(msg, null, 0, 0);
}

public void setHookOn(){
	hookThread = new HookThread();
	hookThread.start();
}

public void setHookOff(){
	synchronized(this) {
		User32.INSTANCE.UnhookWindowsHookEx(hhk);
		hhk = null;
		isFocused = false;
	}
}

private class HookThread extends Thread {
	@Override
	public void run() {
		setHookOnInner();
	}
}

相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值