真的懒得上图了,很累。实验的时候请先理解源代码再运行!!!因为会涉及到锁定系统,禁用alt和更改管理员密码等操作。
众所周知,java是不太适合操作系统底层的,所以类似禁用任务管理器,禁用键盘的操作真的很难,我用了其它思路来间接解决这个问题。程序一运行,将全屏显示在最前端,屏蔽关闭和最小化,杀灭explorer进程,使用户无法按win键,杀灭taskmgr进程,防止用户之前启动了任务管理器并置于前端,将错误的卡置于刷卡器,屏幕报错,超过5次错误,锁定一分钟,此时将不接受所有卡,一分钟后再错再锁一分钟,以此类推,刷正确的卡将恢复离开时的桌面(就是程序退出,重开explorer),最关键的问题是如何防止用户调用ctrl+alt+del(调出任务管理器)或alt+f4(关闭程序)以及alt+Tab(切换程序),先前我的想法是加一个线程,不断地检查并关闭taskmgr,但因为太耗费资源而禁用(i7的cpu99%,16g内存10分钟95%),后来我让程序不断模拟按键esc,任务管理器调出后会迅速关闭,但这种方法无法防止后面两个快捷键,查了很多方法均以失败告终,最终,我想了一个不是办法的办法,监听窗口alt按键(因为此时窗口全屏不可能失去焦点),当用户按下alt后立刻自动锁定计算机,如果计算机此时是空密码将自动添加一个预设密码。关于间隔时间检测:我加了一个线程,定义了一个变量,每100毫秒自减,当小于-50会固定在-50(防止int溢出),当多次错误会将变量置于600,随着时间递减,然后再在验证的时候看下这个变量是否为负数,如果不是,拒绝验证
然而,这和直接win+l锁定计算机有什么不同?我想了一下主要有几点:1.退出程序密码,原本的系统密码,和尝试按alt后锁定计算机的密码相互独立,也就是说,可以多加一个系统锁2.自定义多次尝试密码错误的操作:可以关机,可以删除指定文件,甚至可以发送警告短信或邮件,同时对于两次错误密码的间隔时间也可以设置3.多人共享一个用户,密码由刷卡机控制,凡是符合条件的卡都可进入系统。顺便说下,可以将程序密码,预设系统密码放到程序外面,写个程序修改这些加密数据,但是很累,不想做了。
===然而,感觉这些并没有什么卵用(手动摊手)===
源代码
package abc; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; public class AFrame extends JFrame implements Runnable { private static final long serialVersionUID = 1L; int n = 5; int t = -50; Toolkit kit = Toolkit.getDefaultToolkit(); JFrame jf; Dimension screensize = kit.getScreenSize(); int Width = screensize.width; int Height = screensize.height; public AFrame() { jf = new JFrame(); jf.setBounds(0, 0, Width, Height); Container c = new Container(); JLabel jb1 = new JLabel("解锁计算机请将智能卡放入感应区"); JLabel jb2 = new JLabel("xxx制作"); jf.setUndecorated(true); JPasswordField jtf = new JPasswordField(); jb1.setBounds(Width / 2 - 320, 100, 750, 50); jb2.setBounds(Width / 2 - 170, 200, 800, 50); jtf.setBounds(Width / 2 - 120, 300, 200, 25); jb1.setFont(new Font("宋体", 1, 45)); jb2.setFont(new Font("宋体", 1, 25)); jtf.setFont(new Font("宋体", 1, 25)); jb1.setOpaque(true); jb1.setBackground(Color.GREEN); c.add(jb1); c.add(jb2); c.add(jtf); jf.add(c); jf.setVisible(false); jf.setVisible(true); Runtime r = Runtime.getRuntime(); try { r.exec("taskkill /f /im taskmgr.exe"); r.exec("taskkill /f /im explorer.exe"); } catch (IOException e1) { e1.printStackTrace(); } jtf.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ALT) { Runtime r = Runtime.getRuntime(); try { r.exec("rundll32 user32.dll,LockWorkStation"); String exec = "net user \"Administrator\" \"123\""; r.exec(exec); } catch (IOException e1) { e1.printStackTrace(); } } if (e.getKeyCode() == KeyEvent.VK_ENTER) { String s = new String(jtf.getPassword()); if ((s.equals("123")||s.equals("234") ||s.equals("456") )&& t < 0) { Runtime r = Runtime.getRuntime(); try { r.exec("explorer.exe"); } catch (IOException e1) { e1.printStackTrace(); } System.exit(0); } else if (t >= 0) { jb1.setText(" 读码被锁,还有" + (t / 10) + "秒!"); jtf.setText(""); jtf.requestFocus(); jb1.setBackground(Color.yellow); } else { n--; jb1.setText(" 智能卡读码错误!还有" + n + "次机会!"); jb1.setBackground(Color.red); jtf.setText(""); jtf.requestFocus(); if (n <= 0) { jb1.setText(" 读码关闭1分钟!"); t = 600; jtf.setText(""); jtf.requestFocus(); } } } } @Override public void keyReleased(KeyEvent arg0) { } @Override public void keyTyped(KeyEvent arg0) { } }); } @Override public void run() { while (true) { try { Thread.sleep(100); t--; if (t <= -50) { t = -50; } System.out.println(t); } catch (Exception e) { e.printStackTrace(); } } } } package abc; public class Test{ public static void main(String[] args) { AFrame a=new AFrame(); new Thread(a,"A").start(); } }