java如何实现一键退出,用JAVA写的一个快速关闭的小软件

本帖最后由 Songzhiqiang 于 2020-11-21 15:11 编辑

【软件发展史】

前一段时间在论坛看到了一个划水的软件(只支持看小说),我只找到一个隐藏的功能。

因为不知道怎么快速关闭,就索性自己写了一个用(自用,能用就行)。

这是用JavaSwing写的界面(太麻烦了)。

原来没学过JavaSwing,都是现学现卖,一点点怼上去的(本人小白一枚)。

在制作的过程中,遇到了好多坑,想实现逻辑的时候感觉很简单,实践起来还是挺坑的(多动手)。

已经在没有JAVA环境的机器上测试 过了,可以安装打开,下面是测试图(图片有点大......)

55fd2b2273b5a8b4531f72773c469d6e.gif

QQ图片20201120233431.png (167.42 KB, 下载次数: 0)

2020-11-21 07:55 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

图像_2020-11-21_083015.png (40.25 KB, 下载次数: 0)

2020-11-21 08:29 上传

逻辑主要是通过调用tasklist命令,获取到程序名称及PID,然后通过设置热键,获取到程序的PID将其进程杀死。

已知Bug:

获取数据不正常:第一次点击获取进程后,他可以正常获取并显示,

第二次点击他会出现不显示数据或显示的数据无法选中等情况发生。

我在百度上找了好久,没找到一个有效的解决方法,最终放弃了。

其他Bug暂时还未找到.......

【使用方法】

打开你所需要关闭的应用

打开关闭应用的软件

点击关闭软件的获取进程

选中进程并点击确认

点击隐藏按钮(程序就会隐藏到后台运行)

设置的快捷键:

杀死进程:F8

显示程序:F9

【使用技术】

使用的是纯Java技术:

创建的SpringBoot项目(没用它)+JavaSwing(制作界面)+JavaSE(鼠标键盘事件)+JavaEE(基础操作)

主要参考:C语言中文网中各种JavaSwing组件:http://c.biancheng.net/swing/

CSDN大佬JavaSwing的博客:https://blog.csdn.net/u010834071/article/details/38471605?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-4-38471605.nonecase&utm_term=java图形优化界面&spm=1000.2123.3001.4430

CSDN大佬的键盘监听::https://blog.csdn.net/qq_45933858/article/details/103789315

CSDN大佬利用exe4j+Inno打包java程序:https://blog.csdn.net/lxw1005192401/article/details/81557537

其中实现全局键盘监听的时候用到了jintellitype的jar包,需要结合两个dll文件才可以使用(老Java了)

【源码分享】

代码写的很low,各位大大,看看就好

目录结构(硬拼出来的):

Assembly:

CreateButton:创建的JPanle(面板)、JList(列表框)、JScrollPane(滚动框)、Jbutton(按钮)、JLabel(标签)

WindowListened:键盘监听事件、鼠标点击事件

Job:

CreateUi:创建程序的窗口及main方法

Util:

GetPid:获取到程序名称及对应的Pid

KillApp:结束应用进程

55fd2b2273b5a8b4531f72773c469d6e.gif

图像_2020-11-21_083620.png (56.55 KB, 下载次数: 0)

2020-11-21 08:36 上传

[Java] 纯文本查看 复制代码package com.close.demo.UI.Assembly;

import com.close.demo.UI.Util.GetPid;

import javax.swing.*;

import java.awt.*;

/**

* 创建按钮等组件

*/

public class CreateButton {

/**

* 添加按钮

*

* [url=home.php?mod=space&uid=952169]@Param[/url] jFrame 窗口1(主窗口)

*/

public void CreateButtons(JFrame jFrame) {

//创建面板

JPanel jPanel1 = new JPanel();

//创建一个列表

JList jList = new JList<>();

//创建标签7

JLabel jLabel7 = new JLabel();

//将JPanel的布局管理器设置为空(方便自己设置按钮的位置)

jPanel1.setLayout(null);

//将面板放入窗口中

jFrame.setContentPane(jPanel1);

//添加使用说明到窗体中

CreateButton cb = new CreateButton();

cb.Instructions(jPanel1);

//创建查询按钮

JButton jButton1 = new JButton("获取进程");

//设置按钮的位置及大小

jButton1.setBounds(20, 160, 115, 40);

//设置按钮中字体的属性

Font f = new Font("宋体", Font.PLAIN, 13);

//将设置的字体应用到按钮中的文字

jButton1.setFont(f);

//将按钮放入面板中

jPanel1.add(jButton1, jPanel1);

//调用监听(弹出提示框)

WindowListened windowListened = new WindowListened();

//鼠标监听器(查询进程)

windowListened.Listened1(jButton1, jPanel1, jList, jLabel7);

//创建确认按钮

JButton jButton2 = new JButton("点我确认");

//设置按钮的位置及大小

jButton2.setBounds(160, 160, 115, 40);

//将设置的字体应用到按钮中的文字

jButton2.setFont(f);

//将按钮放入面板中

jPanel1.add(jButton2);

//鼠标监听器3(确认)

windowListened.Listened3(jButton2, jList, jFrame);

//创建隐藏按钮

JButton jButton3 = new JButton("点我隐藏");

//设置按钮的位置及大小

jButton3.setBounds(300, 160, 115, 40);

//将设置的字体应用到按钮中的文字

jButton3.setFont(f);

//将按钮放入面板中

jPanel1.add(jButton3);

//调用监听

windowListened.Listened2(jButton3, jFrame);

}

/**

* 添加标签

*

* @param jPanel1 面板1

*/

public void Instructions(JPanel jPanel1) {

//创建居中的使用说明

JLabel jLabel1 = new JLabel("使用说明");

// jLabel1.setText();

//设置使用说明标签的位置

jLabel1.setBounds(175, 0, 115, 30);

//让使用说明标签使用字体属性

jLabel1.setFont(new Font("黑体", Font.BOLD, 20));

//将使用说明标签添加到面板中

jPanel1.add(jLabel1);

//创建说明第一步的标签

JLabel jLabel2 = new JLabel(" 1.点击查询用户进程按钮(会将当前所有用户的进程及其对应的PID查询出来," +

"并显示到下方)。");

//设置第一步标签的位置

jLabel2.setBounds(0, 30, 450, 40);

//让第一步标签使用字体属性

jLabel2.setFont(new Font("宋体", Font.PLAIN, 15));

//将第一步标签添加到面板中

jPanel1.add(jLabel2);

//创建说明第二步标签

JLabel jLabel3 = new JLabel(" 2.然后选中所想要使用快捷键杀死的应用并点击确定。");

//设置第二步标签的位置

jLabel3.setBounds(0, 60, 450, 40);

//让第二步标签使用字体属性

jLabel3.setFont(new Font("宋体", Font.PLAIN, 15));

//将第二步标签添加到面板中

jPanel1.add(jLabel3);

//创建说明第三步标签

JLabel jLabel4 = new JLabel(" 3.最后点击隐藏即可(隐藏后按键盘的F8,即可立即关闭该应用)。");

//设置第二步标签的位置

jLabel4.setBounds(0, 90, 450, 40);

//让第二步标签使用字体属性

jLabel4.setFont(new Font("宋体", Font.PLAIN, 15));

//将第三步标签添加到面板中

jPanel1.add(jLabel4);

//创建分割符

JLabel jLabel5 = new JLabel("--------------------------------------------------------");

//设置分割符的位置

jLabel5.setBounds(0, 117, 450, 40);

//让分割符使用字体属性

jLabel5.setFont(new Font("宋体", Font.PLAIN, 15));

//将分割符添加到面板中

jPanel1.add(jLabel5);

//创建提示标签

JLabel jLabel6 = new JLabel("您选择了:");

//设置位置

jLabel6.setBounds(60, 205, 450, 40);

//字体属性

jLabel6.setFont(new Font("宋体", Font.BOLD, 15));

//添加到面板中

jPanel1.add(jLabel6);

}

/**

* 创建列表框

*

* @param jPanel1 面板1

*/

public void CreateList(JPanel jPanel1, JList jList, JLabel jLabel7) {

//只能选择一个元素

jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

//设置列表框显示的字体属性并使用字体属性

jList.setFont(new Font("宋体", Font.PLAIN, 15));

GetPid getPid = new GetPid();

jList.setListData(getPid.SelectPid().toArray());

//给列表框添加滚动窗

JScrollPane jScrollPane = new JScrollPane(jList);

//设置滚动窗的位置及大小

jScrollPane.setBounds(10, 250, 425, 305);

//将列表框添加到面板

jPanel1.add(jScrollPane);

}

}

[Java] 纯文本查看 复制代码package com.close.demo.UI.Assembly;

import javax.swing.*;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;

import java.awt.*;

import java.awt.event.ActionEvent;

import com.close.demo.UI.Util.KillApp;

import com.melloware.jintellitype.HotkeyListener;

import com.melloware.jintellitype.JIntellitype;

/**

* 获取数据的工具类

*/

public class WindowListened {

//关闭应用快捷键(F8)

public static final Integer KEY_1 = 119;

//显示界面快捷键(F9)

public static final Integer KEY_2 = 120;

//关闭界面快捷键(F10)

//TODO 未使用

public static final Integer KEY_3 = 116;

/**

* * 添加查询进程点击事件(查询进程)

*

* @param jButton1 按钮1(查询进程)

*/

public void Listened1(JButton jButton1, JPanel jPanel1, JList jList, JLabel jLabel7) {

// jList.validate();

//添加查询进程的点击事件

jButton1.addActionListener(new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

CreateButton cb = new CreateButton();

cb.CreateList(jPanel1, jList, jLabel7);

//添加列表点击事件

jList.addListSelectionListener(new ListSelectionListener() {

@Override

public void valueChanged(ListSelectionEvent e) {

//后台输出一下,测试用

// if (jList.getValueIsAdjusting()) {

// System.out.println(jList.getSelectedValue());

// }

//将点击后的名称存入标签中

jLabel7.setText(jList.getSelectedValuesList().toString().substring(1, 27));

//设置标签的位置及大小

jLabel7.setBounds(135, 207, 450, 40);

//设置标签7的字体属性

jLabel7.setFont(new Font("宋体", Font.BOLD, 15));

//将标签7放入面板1中

jPanel1.add(jLabel7);

}

});

//执行重新布局(否则列表框及滚动框不会出现)

jPanel1.validate();

//弹出获取成功的提示框

JOptionPane.showMessageDialog(null, "获取进程成功");

}

});

}

/**

* 创建鼠标监听按钮3(是否隐藏)

*

* @param jButton3 按钮3(是否隐藏)

* @param jFrame (弹出窗口)

*/

public void Listened2(JButton jButton3, JFrame jFrame) {

//添加是否隐藏的点击事件

jButton3.addActionListener(new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

//创建新的窗口

JFrame jFrame1 = new JFrame("提示");

//设置窗口的大小

jFrame1.setPreferredSize(new Dimension(300, 225));

//锁定窗口大小

jFrame1.setResizable(false);

//居中显示

jFrame1.setLocationRelativeTo(null);

//显示新的窗口

jFrame1.pack();

jFrame1.setVisible(true);

//创建面板

JPanel jPanel3 = new JPanel();

//将JPanel的布局管理器设置为空(方便自己设置按钮的位置)

jPanel3.setLayout(null);

//将面板放入窗口中

jFrame1.setContentPane(jPanel3);

//添加确定按钮

JButton jButton = new JButton("没点错");

jButton.setPreferredSize(new Dimension());

//设置按钮的位置及大小

jButton.setBounds(40, 140, 80, 30);

//设置按钮中字体的属性

Font f = new Font("宋体", Font.PLAIN, 13);

//将设置的字体应用到按钮中的文字

jButton.setFont(f);

//将按钮放入面板中

jPanel3.add(jButton);

//添加取消按钮

JButton jButton1 = new JButton("点错了");

jButton1.setPreferredSize(new Dimension());

//设置按钮的位置及大小

jButton1.setBounds(175, 140, 80, 30);

//设置按钮中字体的属性

jButton1.setFont(f);

//将按钮放入面板中

jPanel3.add(jButton1);

//创建标签

JLabel jLabel = new JLabel();

jLabel.setText("你是点错了还是真的要隐藏");

//设置使用说明标签的位置

jLabel.setBounds(60, 60, 200, 30);

//给使用说明标签添加字体属性

Font f1 = new Font("黑体", Font.BOLD, 13);

//让使用说明标签使用字体属性

jLabel.setFont(f1);

//将使用说明标签添加到面板中

jPanel3.add(jLabel);

//添加窗口的点击事件(没点错)

jButton1.addActionListener(new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

//关闭当前窗口

jFrame1.dispose();

}

});

//添加窗口的点击事件(点错了)

jButton.addActionListener(new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

//关闭当前窗口

jFrame1.dispose();

//将主窗口设为不可见,可实现隐藏进程

jFrame.setVisible(false);

}

});

}

});

}

/**

* 添加确认按钮点击事件

*

* @param jButton2

*/

public void Listened3(JButton jButton2, JList jList, JFrame jFrame) {

//给按钮二(确认)添加点击事件

jButton2.addActionListener(new AbstractAction() {

@Override

public void actionPerformed(ActionEvent e) {

//进行判断是否选择

if (jList.getSelectedValue() == null) {

JOptionPane.showMessageDialog(null, "你玩我呢????!!!!");

} else {

//选择并点击确认后弹出提示框

JOptionPane.showMessageDialog(null, "您选择了" + jList.getSelectedValue());

//继续弹出提示框

JOptionPane.showMessageDialog(null, "已经做好了随时关闭的准备(按F8关闭)");

//设置关闭的快捷键

JIntellitype.getInstance().registerHotKey(1, 0, KEY_1);

//设置显示界面的快捷键

JIntellitype.getInstance().registerHotKey(2, 0, KEY_2);

JIntellitype.getInstance().registerHotKey(3, 0, KEY_3);

JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {

@lombok.SneakyThrows

@Override

public void onHotKey(int i) {

switch (i) {

case 1:

//调用kill程序的方法

KillApp killApp = new KillApp();

killApp.Kill(jList);

break;

case 2:

//显示界面

jFrame.setVisible(true);

break;

}

}

});

}

}

});

}

}

感觉篇幅过长就不放所有的代码了(主要是写的烂+还没优化)

第一次发这种帖子,有什么不对的地方请多多指教

我将成品和源码放到链接中了,感兴趣的可以下载蓝奏:https://wwa.lanzous.com/b00u0cu1e  密码:7qzy

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值