因为上下班的时候,老是忘记打卡(其实这不是重点,因为可以补卡嘛),重点是下班走的时候总是忘记关空调(谁最后走忘记关空调,罚100。。。)
我一开始的做法是,在主机上贴个便签,写上关空调三个大字,坐在电脑旁,只要你眼睛稍微一瞥,就是看到。可是依旧是该忘还得忘,那么明显一个便签贴在那,走的时候死活看不到,我有什么办法!
然后我就想做个弹窗提醒,一到下班的点,就弹窗提醒,然后就关空调,下班就关,总不会忘了吧。刚好那两天因为项目需要,我写了个vbs脚本,用vbs启动jar和exe程序这些。就想用vbs做个弹窗。要求就是:在指定时间弹窗。
我是用循环来判断时间是否到了指定时间,然后发现这样太耗cpu了,占了20%左右的cpu,因为它是在一直不停的执行。这样肯定不行,就加了个休眠的语句,多久执行一次,但是这样又不准了,所以感觉又实现不了(这vbs我也不太懂)
最后决定用java。

先看效果:

70dd904c9ab09fa1e7fad24c4dc5f689_20210610162309460.png

全部代码:

  1. package org.liip;
  2. import javax.swing.*;
  3. import javax.swing.plaf.FontUIResource;
  4. import java.awt.*;
  5. import java.io.*;
  6. import java.util.*;
  7. import java.util.List;
  8. import java.util.Timer;
  9. /**
  10. * @Author: Mr.Luo
  11. * @Version: 1.0
  12. * @Description: TODO
  13. * @DateTime: 2022/12/26
  14. **/
  15. public class Remind {
  16. public static void main(String[] args){
  17. try {
  18. List<Map<String, String>> list = readTxt();
  19. for (int i = 0; i < list.size(); i++) {
  20. Map<String, String> map = list.get(i);
  21. String time = map.get("time");
  22. String msg = map.get("msg");
  23. String[] split = time.split(":");
  24. //获取时、分、秒
  25. int hour = Integer.parseInt(split[0]);
  26. int minute = Integer.parseInt(split[1]);
  27. int second = Integer.parseInt(split[2]);
  28. cacheTimer(hour,minute,second,msg);
  29. }
  30. }catch (Exception e){
  31. e.printStackTrace();
  32. }
  33. }
  34. private static void cacheTimer(int hour, int minute, int second, final String msg){
  35. try{
  36. Calendar calendar = Calendar.getInstance();
  37. calendar.set(Calendar.HOUR_OF_DAY, hour);// 时
  38. calendar.set(Calendar.MINUTE, minute);// 分
  39. calendar.set(Calendar.SECOND, second);// 秒
  40. Timer timer = new Timer();
  41. //schedule(TimerTask task, Date time):安排在指定的时间执行指定的任务。
  42. timer.schedule(new TimerTask(){
  43. @Override
  44. public void run(){
  45. //创建一个窗体,设置窗体置顶
  46. JFrame jf = new JFrame();
  47. jf.setAlwaysOnTop(true);
  48. //设置提醒信息的字体样式
  49. UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("宋体", 1, 18)));
  50. //一个警告弹窗,因为要将弹窗置顶,所以创建一个JFrame 添加到这里,2 代表的是这个弹窗是警告弹窗
  51. JOptionPane.showMessageDialog(jf, msg, "提醒", 2);
  52. }
  53. }, calendar.getTime());
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. /**
  59. * 读取文本内容:Remind.txt 里面就是设置要提示的时间和提醒信息
  60. */
  61. private static List< Map<String,String>> readTxt() throws IOException {
  62. // Remind.txt 要是可以更改的,如果放在项目里,打包了之后就不能更改了,就无法设置了
  63. String path = System.getProperty("user.dir");//jar包或exe程序所在目录名
  64. InputStreamReader fReader = new InputStreamReader(new FileInputStream(path+"/Remind.txt"),"UTF-8");
  65. BufferedReader reader = new BufferedReader(fReader);
  66. String lineTxt=null;
  67. List< Map<String,String>> list = new ArrayList<Map<String,String>>();
  68. while((lineTxt=reader.readLine())!=null){
  69. //以“||”进行分割
  70. String[] split = lineTxt.split("\\|\\|");
  71. Map<String,String> map = new HashMap<String,String>();
  72. map.put("time",split[0]);//提醒时间
  73. map.put("msg",split[1]);//提醒信息
  74. list.add(map);
  75. }
  76. return list;
  77. }
  78. }

Remind.txt 内容

注意文件路径!!

  1. 08:10:00||现在是中午0810分,该上班打卡了!
  2. 12:01:00||现在是中午1201分,该下班打卡了!
  3. 13:00:00||现在是中午13点,上班打卡了吗?

时间和提醒信息用 “||” 分割,一行设置一个提醒,然后打包成jar,再用exe4j将jar打包成exe程序。

结果如图:

fc9258f9acac9ae931f6b65a22dfd6fa_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE2NTIyMA==,size_16,color_FFFFFF,t_70.png
先在Remind.txt 设置好哪个时间点要提醒什么内容,保存后,启动 Remind.exe程序,它会一直在后台运行,并且不占cpu和内存。
52306db16d84e7e8b3066ad1fd82eb1b_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE2NTIyMA==,size_16,color_FFFFFF,t_70.png
到了你设置的时间点,就会弹窗提醒你该干嘛了。可以将软件设置成开机启动。不过如果你要是更改了 Remind.txt 的内容,需要重新启动该软件。

最后

这个程序以及 exe4j ,见附件。
exe4j.zip
Remind.rar