使用java屏蔽Esc,Ctrl,F1-12等按键

本文介绍了一个使用Java Native Access (JNA)库实现的键盘钩子程序,该程序能够在Windows平台上拦截特定的键盘输入,如ESC、Windows键、Ctrl、Alt、Tab等,并根据按键情况控制一个名为SwingBrowser的浏览器窗口的显示状态。具体功能包括在按下ESC键时切换密码框和考试窗口的可见性,以及屏蔽其他一些系统快捷键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用到jna-4.2.2.jar和jna-platform-4.2.2.jar

package com.xxx.proj.browser;

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser;

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) {
				System.out.println("nCode:" + wParam + ", KEY: " + event.vkCode);
				// 屏蔽windows,alt,tab,del键
				switch (event.vkCode) {
				case 27:// esc
					if (wParam.intValue() == 256) {
						BrowserDialog browser = SwingBrowser.browser;
						PasswordDialog password = SwingBrowser.password;
						// 如果密码框存在,销毁密码框显示考试窗
						if (browser != null) {
							if (password.isVisible()) {
								password.setVisible(false);
								browser.setAlwaysOnTop(true);
							} else {
								browser.setAlwaysOnTop(false);
								password.setAlwaysOnTop(true);
								password.setVisible(true);
							}
						}
					}
				case 91: // windows
				case 162:// ctl
				case 164:// alt
				case 9:// tab
				case 115:// f4
				case 116:// f5
				case 123:// f12
				case 46:// del
					return new LRESULT(1);
				}
			}
			return User32.INSTANCE.CallNextHookEx(hhk, nCode, wParam, null);
		}

	};

	public void run() {
		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) {
			System.out.println(System.currentTimeMillis() + "!");
			if (result == -1) {
			} else {
				User32.INSTANCE.TranslateMessage(msg);
				User32.INSTANCE.DispatchMessage(msg);
			}
		}
	}

	public static void main(String[] args) {
		KeyboardHook kbhook = new KeyboardHook();
		new Thread(kbhook).start();
	}
}

源码:https://download.youkuaiyun.com/download/aidy2008/10678219

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值