如何用JAVA做禁用键盘,鼠标,任务管理器等任务 |
您所在的位置:网站首页 › 键盘怎样打开任务管理器 › 如何用JAVA做禁用键盘,鼠标,任务管理器等任务 |
最近公司要求对软件做一个锁屏功能,要求屏蔽ALT+F4,ALT+TAB,CTRL+ALT+DEL等快捷键,屏蔽任务管理器。我查了一些资料,发现都说要用jni去调用C写的文件,这对不懂C的我来说,真是一个困难的事情。JAVA又无法直接操作底层程序,难道没办法了吗?这时候,我发现了一个开源项目:SWT Win32 Extension。网上有详细的例子,教程和文档,是个中国人做的哦,功能还是比较强大的,不过只能在WINDOWS下,有兴趣可以去看看。其实它也是调用的底层的东西,不过已经全都封装好了,这对广大JAVA开发者来说真是一个好事情。任务也就顺利完成啦。 以下是我的代码,写的比较乱,还没整理,只做了简单的验证,暂时没发现问题,呵呵。 import org.eclipse.swt.internal.win32.OS; import org.eclipse.swt.widgets.Shell; import org.sf.feeling.swt.win32.extension.Win32; import org.sf.feeling.swt.win32.extension.hook.Keyboard_LLHook; import org.sf.feeling.swt.win32.extension.hook.Mouse_LLHook; import org.sf.feeling.swt.win32.extension.hook.data.Keyboard_LLHookData; import org.sf.feeling.swt.win32.extension.hook.data.Mouse_LLHookData; import org.sf.feeling.swt.win32.extension.hook.interceptor.InterceptorFlag; import org.sf.feeling.swt.win32.extension.hook.interceptor.Keyboard_LLHookInterceptor; import org.sf.feeling.swt.win32.extension.hook.interceptor.Mouse_LLHookInterceptor; import org.sf.feeling.swt.win32.extension.registry.RegistryKey; import org.sf.feeling.swt.win32.extension.registry.RegistryValue; import org.sf.feeling.swt.win32.extension.registry.RootKey; import org.sf.feeling.swt.win32.extension.registry.ValueType; import org.sf.feeling.swt.win32.extension.shell.ApplicationBar; /** * Ticket:屏蔽系统快捷键,供锁屏使用(添加屏蔽任务管理器,禁用鼠标事件,隐藏任务栏) * * @author XXXX */ public class WinEventInterceptor { private static boolean altPressed = false; private static Keyboard_LLHookInterceptor keyboard_LLHookInterceptor; private static Mouse_LLHookInterceptor mouse_LLHookInterceptor; static { keyboard_LLHookInterceptor = new Keyboard_LLHookInterceptor() { @Override public InterceptorFlag intercept(Keyboard_LLHookData hookData) { int vkCode = hookData.vkCode(); // if (vkCode == OS.VK_MENU) { if (vkCode == OS.VK_LMENU || vkCode == OS.VK_RMENU) { if (hookData.getFlags() == 0x80) { altPressed = false; } else altPressed = true; } boolean isCtrlPressed = OS.GetKeyState(OS.VK_CONTROL) < 0 ? true : false; // 屏蔽windows键 if (vkCode == 91 || vkCode == 92) { return InterceptorFlag.FALSE; } // 屏蔽ALT+ESC if (altPressed && vkCode == OS.VK_ESCAPE) { return InterceptorFlag.FALSE; } // 屏蔽CTRL+ESC if (isCtrlPressed && vkCode == OS.VK_ESCAPE) { return InterceptorFlag.FALSE; } // 屏蔽ALT+TAB if (altPressed && vkCode == OS.VK_TAB) { return InterceptorFlag.FALSE; } // 屏蔽ALT+F4 if (altPressed && vkCode == OS.VK_F4) { return InterceptorFlag.FALSE; } return InterceptorFlag.TRUE; } }; mouse_LLHookInterceptor = new Mouse_LLHookInterceptor() { @Override public InterceptorFlag intercept(Mouse_LLHookData hookData) { return InterceptorFlag.FALSE; } }; } /** * 鼠标恢复 */ public static void resetMouse() { if (Mouse_LLHook.isInstalled()) Mouse_LLHook.unInstallHook(); } /** * 将鼠标设为不可用 */ public static void setMouseDisable() { if (!Mouse_LLHook.isInstalled()) { Mouse_LLHook.addHookInterceptor(mouse_LLHookInterceptor); Mouse_LLHook.installHook(); } } /** * 自定义添加禁用哪些鼠标事件 * * @param mouseEvents */ public static void setMouseDisable(final MOUSE_EVENT... mouseEvents) { if (!Mouse_LLHook.isInstalled()) { Mouse_LLHook.addHookInterceptor(new Mouse_LLHookInterceptor() { @Override public InterceptorFlag intercept(Mouse_LLHookData hookData) { if (mouseEvents == null) { return InterceptorFlag.FALSE; } MOUSE_EVENT event = null; if (hookData.getWParam() == 512) { event = MOUSE_EVENT.MOVE; } else if (hookData.getWParam() == 513 || hookData.getWParam() == 514) { event = MOUSE_EVENT.LEFT_PRESS; } else if (hookData.getWParam() == 516 || hookData.getWParam() == 517) { event = MOUSE_EVENT.RIGHT_PRESS; } else if (hookData.getWParam() == 519 || hookData.getWParam() == 520) { event = MOUSE_EVENT.MIDDLE_PRESS; } else if (hookData.getWParam() == 522 && hookData.getMouseData() > 0) { event = MOUSE_EVENT.WHEEL_UP; } else if (hookData.getWParam() == 522 && hookData.getMouseData() < 0) { event = MOUSE_EVENT.WHEEL_DOWN; } for (MOUSE_EVENT mouse_event : mouseEvents) { if (mouse_event == event) { return InterceptorFlag.FALSE; } } return InterceptorFlag.TRUE; } }); Mouse_LLHook.installHook(); } } /** * 键盘恢复 */ public static void resetKeyboard() { if (Keyboard_LLHook.isInstalled()) Keyboard_LLHook.unInstallHook(); } /** * 禁用键盘 */ public static void setKeyDisable() { if (!Keyboard_LLHook.isInstalled()) { Keyboard_LLHook.addHookInterceptor(new Keyboard_LLHookInterceptor() { @Override public InterceptorFlag intercept(Keyboard_LLHookData hookData) { return InterceptorFlag.FALSE; } }); Keyboard_LLHook.installHook(); } } /** * 屏蔽键盘(非组合键),例如vkCode是49,50,则屏蔽的键盘的1和2键;具体键盘对应请查询ascII码表 * * @param vkCode * (要屏蔽的键,非组合键) */ public static void setKeyDisable(final int... vkCode) { if (!Keyboard_LLHook.isInstalled()) { Keyboard_LLHook.addHookInterceptor(new Keyboard_LLHookInterceptor() { @Override public InterceptorFlag intercept(Keyboard_LLHookData hookData) { if (vkCode == null) return InterceptorFlag.FALSE; for (int code : vkCode) { if (code == hookData.vkCode()) return InterceptorFlag.FALSE; } return InterceptorFlag.TRUE; } }); Keyboard_LLHook.installHook(); } } /** * 禁用几个常用快捷键,windows键,ALT+ESC,CTRL+ESC,ALT+TAB,ALT+F4 */ public static void setCommonUseKeyDisable() { if (!Keyboard_LLHook.isInstalled()) { Keyboard_LLHook.addHookInterceptor(keyboard_LLHookInterceptor); Keyboard_LLHook.installHook(); } } /** * 任务管理器恢复 */ public static void resetTaskmgr() { RootKey currentUser = RootKey.HKEY_CURRENT_USER; RegistryKey key = new RegistryKey(currentUser, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"); if (!key.exists()) { key.create(); } RegistryValue value = new RegistryValue(); value.setType(ValueType.REG_DWORD); value.setData(0); value.setName("DisableTaskmgr"); key.setValue(value); } /** * 禁用任务管理器 */ public static void setTaskmgrDisable() { RootKey currentUser = RootKey.HKEY_CURRENT_USER; RegistryKey key = new RegistryKey(currentUser, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"); if (!key.exists()) { key.create(); } RegistryValue value = new RegistryValue(); value.setType(ValueType.REG_DWORD); value.setData(1); value.setName("DisableTaskmgr"); key.setValue(value); } enum MOUSE_EVENT { MOVE, LEFT_PRESS, RIGHT_PRESS, MIDDLE_PRESS, WHEEL_UP, WHEEL_DOWN } /** * 设置快捷键,按下此快捷键,程序的几个常用快捷键,windows键,ALT+ESC,CTRL+ESC,ALT+TAB,ALT+F4将重新被禁用 * * @param code * 快捷键的编码,例如F10可设为121,即OS.VK_F10 */ public static void restartHook(final int code) { if (!Keyboard_LLHook.isInstalled()) { Keyboard_LLHook.addHookInterceptor(new Keyboard_LLHookInterceptor() { @Override public InterceptorFlag intercept(Keyboard_LLHookData hookData) { int vkCode = hookData.vkCode(); if (vkCode == code) { Keyboard_LLHook.unInstallHook(); setCommonUseKeyDisable(); setTaskmgrDisable(); } return InterceptorFlag.TRUE; } }); Keyboard_LLHook.installHook(); } } /** * 隐藏任务栏 * * @param handle * 句柄,如shell.handle */ public static void setTaskBarHide() { ApplicationBar.setAppBarState(new Shell().handle, Win32.STATE_AUTOHIDE_ALWAYSONTOP); } /** * 恢复任务栏 * * @param handle * 句柄,如shell.handle */ public static void resetTaskBar() { ApplicationBar.setAppBarState(new Shell().handle, Win32.STATE_ALWAYSONTOP); } /** * 启用hook */ public static void startHOOK() { // 启动前先禁用快捷键 WinEventInterceptor.setCommonUseKeyDisable(); // 禁用任务管理器 WinEventInterceptor.setTaskmgrDisable(); // 隐藏任务栏 WinEventInterceptor.setTaskBarHide(); } /** * 关掉hook */ public static void closeHOOK() { // 恢复快捷键 WinEventInterceptor.resetKeyboard(); // 恢复任务管理器 WinEventInterceptor.resetTaskmgr(); // 显示任务栏 WinEventInterceptor.resetTaskBar(); } }屏蔽任务管理器是用了一个取巧的办法,在注册表中设置字段,让其不可用。屏蔽快捷键+注册表不可用时,程序就实现锁屏无法切换了。
鼠标事件是后添加的。
欢迎大家提出意见! 依赖了两个jar包 org.sf.feeling.swt.win32.extension.jar swt-3.3-win32-win32-x86.jar 请自行搜索下载 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |