如何用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

请自行搜索下载

没有更多推荐了,返回首页