package cn.xuexiceshi.wechat.tools;
import java.io.IOException;
import java.util.Timer;
/**
* 微信来消息弹窗小工具
* @作者: 清风不踏雪
* @版本: v1.0
* @作用; 实现了微信、企业微信来消息弹窗,会直接打开程序窗口
* @实现原理:
* 通过CMD命令获取注册表中微信、企业微信的安装和存档信息。
* 再通过存档信息循环遍历,找出加密的数据库文件,
* 最后判断文件的最后修改时间,然后根据安装信息,弹窗。
* @感谢:
* 判断思路来源:(找不到链接了,是个批处理来着)作者:phenix
* 读取注册表方法来源:csdn,天真吴邪xie
* (学会了怎么使用 Runtime.getRuntime().exec() 执行CMD命令,并获取返回值)
*
*/
public class Main {
public static void main(String[] args) {
start();
}
/**
* 开始运行程序方法
*/
public static void start(){
//创建工具类
try {
//创建工具类
Tools weChat = new Tools();
Tools wXWork = new Tools(true);
//判断程序是否在运行
if((weChat.getWXStatus() || wXWork.getWXStatus())
&& (!weChat.getFile().isDirectory() || !wXWork.getFile().isDirectory())){
Timer timer = new Timer("WXTanChuan");//创建定时器
//weChat是微信、wXWork是企业微信;0表示等待0毫秒后开始执行;1000*3表示每隔3秒重复执行一次
timer.schedule(weChat, 0,1000 * 3);//开始执行任务
timer.schedule(wXWork, 0,1000 * 3);//开始执行任务
while (weChat.getWXStatus() || wXWork.getWXStatus()){
if(!wXWork.getWXStatus()){
wXWork.cancel();
}else if(!weChat.getWXStatus()){
weChat.cancel();
}
System.gc();
}
timer.cancel();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package cn.xuexiceshi.wechat.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.TimerTask;
public class Tools extends TimerTask {
//加密数据库文件名
final private String weChatTargetFile = "MSG0.db-wal";
final private String wXWorktargetFile = "message.db-wal";
//cmd查询注册表返回结果前缀
final private String workPathPrefix;
final private String filesSavePathPrefix;
final private String exeName;
//微信、企业微信的工作、存档的绝对路径
//默认路径是为了防止未安装程序,出现的异常
private String workPath;
private String filesSavePath;
//获取工作路径的CMD命令
private String getWorkPathCmd;
//获取存档路径的CMD命令
private String getFilesSavePathCmd;
//是否企业微信
private boolean isEnterprise;
//加密数据库文件的绝对路径
private File file;
//数据库最后修改的时间
private String date = "1970-01-01 08:00:00";
@Override
public void run() {
try {
String newDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file.lastModified());
if(!date.equals(newDate) && getWXStatus()){
date = newDate;
Process wx = Runtime.getRuntime().exec(workPath + "\\" +exeName);
//System.out.println(exeName + "消息最新更新于:" + date );//测试、预留、备用
Thread.sleep(1000);
if(wx.isAlive()){
wx.destroy();
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
/**
* 这个方法用来获取微信、企业为的工作和存档路径
* 实现原理为读取注册表的内容
*/
private void getPath(){
String[] workPath = getRunCmdResult(getWorkPathCmd);
String[] filesSavePath = getRunCmdResult(getFilesSavePathCmd);
//判断然后再给变量赋值,得到运行目录,和存档目录。
if(workPath != null && workPath.length >= 3 ){
if(workPath[0].equals(workPathPrefix)){
if(workPath[2].endsWith("exe")){
workPath[2] = workPath[2].substring(0,workPath[2].lastIndexOf("\\"));
}
this.workPath = workPath[2];
}
}
if(filesSavePath != null && workPath.length >= 3){
if(filesSavePath[0].equals(filesSavePathPrefix)){
if(filesSavePath[2].endsWith("exe")){
filesSavePath[2] = filesSavePath[2].substring(0,filesSavePath[2].lastIndexOf("\\"));
}
this.filesSavePath = filesSavePath[2];
}
}
}
/**
* 因为有些是改过默认存档位置的,所以直接从注册表获取方便。
* 这个方法用来获取当前系统用户的文档位置
* @Return 文档的位置
*/
private String getUsersDocumentsPath(){
String[] strs = getRunCmdResult("reg query \"HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders\" | findstr \"Personal\"");
if(strs != null && strs.length >= 3){
if(strs[2].startsWith("%USERPROFILE%")){
return System.getProperty("user.home") + "\\Documents";
}
return strs[2];
}
return System.getProperty("user.home") + "\\Documents";
}
/**
* 这个方法用来执行CMD命令
* @Param cmd cmd命令,最好配合findstr命令使用,因为此方法只返回一行数据
* @return 执行结果,此方法只返回一行数据,命令不对、结果为空,返回null
*/
private String[] getRunCmdResult(String cmd){
try {
Process pos = Runtime.getRuntime().exec("cmd /c " + cmd);
InputStreamReader inp = new InputStreamReader(pos.getInputStream());
BufferedReader buf = new BufferedReader(inp);
String str;
if((str = buf.readLine()) != null){
str = str.trim();
if(pos.isAlive()){
pos.destroy();
}
return str.split(" ");
}
if(pos.isAlive()){
pos.destroy();
}
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取微信、企业微信运行状态
* @return true表示正在运行,false表示未在运行
*/
public boolean getWXStatus(){
return getExeStatus(exeName);
}
/**
* 获取程序的运行状态
* @param name 程序名字
* @return true表示正在运行,false表示未在运行
*/
private boolean getExeStatus(String name){
String[] strings = getRunCmdResult("tasklist | findstr \" "+ exeName +"\"");
if(strings != null){
return true;
}
return false;
}
/**
* 获取微信加密数据库文件的绝对路径
* @param filePath 微信的安装目录
*/
private void getWeChatTargetFile(String filePath){
File workDir = new File(filePath);
if(workDir.isDirectory()){
File[] files = workDir.listFiles();
for (File file1 : files){
if(file1.isDirector
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
由来: 老是收到微信不弹窗,导致我错过很多消息。在Java中,您可以使用微信和企业微信提供的API来接收消息并打开相应的窗口。所以决定自己写个。 原理: 1、自动获取微信、企业微信,工作目录、存档目录、加密数据库文件(不知道这个词对不对)路径。 2、根据加密数据库文件的最后修改时间来判断有没有新消息。有就弹窗。作用: 来消息自动打开微信、企业微信窗口。 环境: 我用的是JDK13.0.2,应该没用到新特性。JDK\JRE 8及以上应该都能用。 使用: 只有在微信、企业微信打开时才能够正常使用、微信、企业微信退出、没有运行自动关闭。
资源推荐
资源详情
资源评论
收起资源包目录
新建文本文档.rar (1个子文件)
新建文本文档.txt 11KB
共 1 条
- 1
资源评论
li642041156
- 粉丝: 5
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 牙科铣床三维建模图纸 STP格式 .zip
- 基于Spring Boot框架的优惠券卡包系统.zip
- SSS Shader Graph
- 基于Spring Boot框架的仿牛客网社区.zip
- 基于Spring Boot框架的仓库管理系统.zip
- OpenNJet实现了NGINX云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器等等
- 基于正负序分离控制的三相离网逆变器,带不平衡阻性负载 图片为基于正序控制的和基于正负序分离控制的离网逆变器分别带载的波形
- 基于Spring Boot框架的乐优商城.zip
- 基于ros2的fast-lio2定位算法
- 基于Spring Boot框架的Hadoop集群管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功