本帖最后由 Songzhiqiang 于 2020-11-21 15:11 编辑
【软件发展史】
前一段时间在论坛看到了一个划水的软件(只支持看小说),我只找到一个隐藏的功能。
因为不知道怎么快速关闭,就索性自己写了一个用(自用,能用就行)。
这是用JavaSwing写的界面(太麻烦了)。
原来没学过JavaSwing,都是现学现卖,一点点怼上去的(本人小白一枚)。
在制作的过程中,遇到了好多坑,想实现逻辑的时候感觉很简单,实践起来还是挺坑的(多动手)。
已经在没有JAVA环境的机器上测试 过了,可以安装打开,下面是测试图(图片有点大......)
QQ图片20201120233431.png (167.42 KB, 下载次数: 0)
2020-11-21 07:55 上传
图像_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:结束应用进程
图像_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