swing小程序之定时按下某个按键(电脑不锁定)
Swingadmin 发布于:2016-07-22 09:27:29
阅读:loading
前段时间用swing写了个小程序是背景,现在办公环境在一台式机上,只有内网环境,实际开发是在这个机器上所运行的一个远程桌面连接,然后有个自己笔记本可连接外网环境,往往在一天工作中,除了特别忙碌没时间外,闲时可以用自己的本上上网,看看新闻,技术论坛等等,本来这没什么,可是办公电脑只要闲置10min就自动锁定了(单位给的用户权限受限),登录密码还特别复杂,除了频繁的复杂密码登录外,这个办公电脑处于锁定状态给人的感觉也不太好,原因大家都懂的。
鉴于这种有情况的时常发生,总想去解决一下,于是找了下资料,发现有个机器人类Robot,可以用他来自动触发一些事件,主要有鼠标与键盘方面的,比如可以移动鼠标位置、滚动鼠标、按下鼠标左右键、按下键盘事件,于是我想的就是定时去触发一些这种事件,让机器定时的处于“活动”状态,然而试过定时移动鼠标位置(没分钟移动鼠标坐标位置)、鼠标滚动(打开eclipse随便找个行数多的文件,将鼠标的焦点处于这个文件的活动状态内,鼠标定时或上或下的滚动)、定时按下键盘(每隔1分钟执行一次,先按下Ctrl键,然后等200毫秒后再按下Shift键,随后等500毫秒再释放这两个键,实际上就是每分钟将进行一次输入法切换,比如我安装的有搜狗输入法,实际效果就跟手工切换输入法一样)等这一系列的验证,发现了一个可行的方式,就是定时切换 caps_lock 键(当然以上的一些方式经实测均不靠谱,前提是我在主机上运行的一个远程桌面上进行验证的),处于远程桌面上运行的系统,而主机与远程桌面所用的大小写键可能有些“连接”动作吧,两个系统的同一个键盘的大小写是不一样的,我猜的,反正在远程桌面上进行大小写的切换就可以解决主机不活动而导致的系统锁定的情况发生,当然我相信还是有很多办法都可以解决的。
一个小程序,所实现的功能就是运行一个小窗口,当最小化时将显示至右下角的系统托盘,在系统托盘右键可打开窗口、可退出窗口,主要的是两个类,参考代码如下:
package cn.chendd.robot.unlock;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;
public class MainWindow extends JFrame{
final int windowWidth = 210;
final int windowHeight = 131;
protected MenuItem open , exit;
protected PopupMenu popup;
protected TrayIcon trayIcon;
/**
*
*/
private static final long serialVersionUID = 1L;
public MainWindow(){
try {
//正常
BeautyEyeLNFHelper.frameBorderStyle =
BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
BeautyEyeLNFHelper.launchBeautyEyeLNF();
} catch (Exception e) {
}
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setTitle("小渣渣");
MyImageIcon logoImage = new MyImageIcon("images/logo.png");
super.setIconImage(logoImage.getImage());
super.setSize(210, 130);
//设置背景图
super.setContentPane(new JPanel(){
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
MyImageIcon icon = new MyImageIcon("images/desktop.jpg");
int width = icon.getIconWidth();
int height = icon.getIconHeight();
int left = (windowWidth - width) / 2;
int top = (windowHeight - height) / 2;
Image image = icon.getImage();
g.drawImage(image, left, top, null);
}
});
initMenu();
//启动键盘按下事件
new Thread(new Runnable() {
@Override
public void run() {
while(true){
//无限执行
KeyRobot.pressKey();
}
}
}).start();
//最小化至系统托盘
this.addWindowListener(new TrayIconAdapter(MainWindow.this));
super.setLocationRelativeTo(null);
super.setResizable(false);
super.setVisible(true);
}
private void initMenu(){
//初始化托盘图标
popup = new PopupMenu();
//打开
open = new MenuItem();
open.setLabel("打开");
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MainWindow.this.setVisible(true);
MainWindow.this.setExtendedState(JFrame.NORMAL);
}
});
popup.add(open);
//退出
exit = new MenuItem();
exit.setLabel("退出");
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popup.add(exit);
}
public static void main(String[] args) {
new MainWindow();
}
}
/**
*
*/
package cn.chendd.robot.unlock;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
/**
* @author chendd
*
*/
public class KeyRobot {
public static void pressKey() {
Robot robot = null;
try {
robot = new Robot();
robot.setAutoDelay(60000);//每1分钟按下一次
robot.keyPress(KeyEvent.VK_CAPS_LOCK);
robot.keyRelease(KeyEvent.VK_CAPS_LOCK);
} catch (AWTException e) {
e.printStackTrace();
}
}
}
运行效果
今天无意中看到了有一楼的回复,才注意到漏了2个类,代码比较简单,如有需要可留下邮箱,我给发源码。
另:这个程序已经改版了,改成的实现为定时1分钟按下/释放电脑Scroll的键,因为按下它也不会影响正常办公,另外,在我会了点点的Delphi语言后,又有了新版本了,所以说除了当前这个鸡肋版本以外还另外有两套更加科学的版本,你值得拥有。
点赞