【问题标题】:is it is possible to disable the windows keys using java是否可以使用java禁用Windows键
【发布时间】:2012-02-18 14:10:09
【问题描述】:

是否可以使用 java 禁用 windows 键和 alt+tab ...

【问题讨论】:

  • 除非您使用内核模式设备驱动程序,否则无法捕获某些击键。为什么 Windows 会允许应用程序阻止您切换当前任务?
  • 虽然您对 Alt+Tab 有意见,但实际上在游戏等全屏应用程序中禁用 Win 键是一个很好的案例。我无法告诉你有多少次我在游戏中不小心撞到了左侧的 Win 键,结果却让整个屏幕最小化。
  • @Will - 大概,Windows 设计者不这么认为......
  • 由于某种原因,在 DirectDraw 独占模式下运行时 Ctrl-Alt-Del 被困住了,但其他键却没有......

标签: java


【解决方案1】:

您可以使用 JNA 来实现这一点。

在类路径中包含 jna.jar 和 platform.jar 并创建以下类。 此类禁用左窗口键 (0x5B) 和右窗口键 (0x5C)。所以你可以在 switch case 语句中添加其他代码。

在您的应用程序启动时尽快调用 KeyHook.blockWindowsKey()。 另一方面,在应用关闭时调用 unblockWindowsKey()。

由于代码仅在 isWindows() 为 true 时执行,因此您始终可以调用 KeyHook.blockWindowsKey(),即使在其他操作系统上运行也是如此。

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.HHOOK; import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT; import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc; import com.sun.jna.platform.win32.WinUser.MSG; public class KeyHook { private static HHOOK hhk; private static LowLevelKeyboardProc keyboardHook; private static User32 lib; public static void blockWindowsKey() { if (isWindows()) { new Thread(new Runnable() { @Override public void run() { lib = User32.INSTANCE; HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); keyboardHook = new LowLevelKeyboardProc() { public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { if (nCode >= 0) { switch (info.vkCode){ case 0x5B: case 0x5C: return new LRESULT(1); default: //do nothing } } return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); } }; hhk = lib.SetWindowsHookEx(13, keyboardHook, hMod, 0); // This bit never returns from GetMessage int result; MSG msg = new MSG(); while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { if (result == -1) { break; } else { lib.TranslateMessage(msg); lib.DispatchMessage(msg); } } lib.UnhookWindowsHookEx(hhk); } }).start(); } } public static void unblockWindowsKey() { if (isWindows() && lib != null) { lib.UnhookWindowsHookEx(hhk); } } public static boolean isWindows(){ String os = System.getProperty("os.name").toLowerCase(); return (os.indexOf( "win" ) >= 0); } }

【讨论】:

  • 嗨。有什么办法可以禁用 ctrl-alt-del?您的代码运行良好,但无法阻止 ctrl-alt-del。任务管理器出现
  • 如何销毁这个线程?在我运行unblockWindowsKey()之后,这个线程还在后台运行
  • @NMNaufaldo 您可以将 Thread 对象存储在类中的一个字段中,并在禁用键阻止程序时中断它。在 while 循环中,您还可以在线程中断时中断。或者,您可以将线程标记为守护线程,以允许 JVM 终止,即使该线程仍在运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2015-03-31
  • 2010-10-26
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多