真的懒得上图了,很累。实验的时候请先理解源代码再运行!!!因为会涉及到锁定系统,禁用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();
}
}
Comments NOTHING