[英]Manually opened Excel / Notepad file (Opened by user), How would like to identify this through java program
Description: Actually I am looking the java code which is basically running in the background, But whenever I want to open a new notepad or excel file, It will capture those file as an input and display the result in output console.描述:实际上我正在寻找基本上在后台运行的 java 代码,但是每当我想打开一个新的记事本或 excel 文件时,它会捕获这些文件作为输入并在 Z78E6221F6393D13566681 控制台中显示结果。
How I can do that, any one can help me on this.我怎么能做到这一点,任何人都可以帮助我。
The following mathod is based on Windows...以下方法基于 Windows...
First of all, when opening files in software like Notepad and Excel, it is executed with a command line with parameters, that is, if Notepad is opened in E:\test.txt, the command line parameters for startup are首先,在记事本、Excel等软件中打开文件时,是用带参数的命令行执行的,即如果记事本在E:\test.txt中打开,启动的命令行参数为
notepad E:\test.txt
In Windows, we can use the wmic command to get the startup parameters of an application.在 Windows 中,我们可以使用wmic命令获取应用程序的启动参数。 The specific usage is:
具体用法是:
wmic process where caption="{exe_name}" get caption,commandline /value
For example, the cmd command to query the command line parameters opened in Notepad is:例如,查询记事本中打开的命令行参数的cmd命令为:
wmic process where caption="notepad.exe" get caption,commandline /value
The returned result is similar to the following:返回的结果类似于以下内容:
Caption=notepad.exe
CommandLine="C:\Windows\system32\NOTEPAD.EXE" H:\2019Summer\软件工程\任务.txt
The above "H:\2019Summer\软件工程\任务.txt" is the file I currently open by notepad.上面的“H:\2019Summer\软件工程\任务.txt”是我目前用记事本打开的文件。 What we need to do is to parse the result String, here is my example java code:
我们需要做的是解析结果字符串,这是我的示例 java 代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class GetOpenedFile {
//QUERY_COMMAND
private static String QUERY_COMMAND = "wmic process where caption=\"{0}\" get caption,commandline /value";
private static String NOTEPAD_NAME = "notepad.exe";
private static String EXCEL_NAME = "excel.exe";
/**
* get execName command line
*
* @param execName like notepad.exe, excel.exe
* @return the all command line of the process {execName}
*/
private static List<String> getExecCommandLines(String execName) {
Runtime runtime = Runtime.getRuntime();
List<String> commandLines = new ArrayList<>();
try {
Process process = runtime.exec(MessageFormat.format(QUERY_COMMAND, execName));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GB2312"));//set your cmd charset(default value is utf8)
String caption = null;
while (true) {
String s = bufferedReader.readLine();
if (s == null) {
break;
}
if (s.length() == 0) {//skip blank string
continue;
}
//get the file name
if (s.startsWith("Caption")) {
caption = s.substring("Caption=".length());
continue;
}
if (s.startsWith("CommandLine=") && caption != null) {
int index = Math.max(s.indexOf(caption), s.indexOf(caption.toUpperCase()));//maybe the exe file name is ALL UPPER CASE, eg. NOTEPAD.EXE
index += caption.length()
+ 1;//Double quotes "
String commandLine = s.substring(index);// command Line
commandLine = commandLine.stripLeading();//strip leading white space
commandLines.add(commandLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return commandLines;
}
/**
* get notepad opened files
*
* @return notepad opened files
*/
public static List<String> getNotepadOpenedFiles() {
List<String> commandLines = getExecCommandLines(NOTEPAD_NAME);
return commandLines.stream()
.filter(s -> s.length() > 0)//skip empty command line
.collect(Collectors.toList());
}
/**
* get excel opened files
* @return excel opened files
*/
public static List<String> getExcelOpenedFiles() {
List<String> commandLines = getExecCommandLines(EXCEL_NAME);
return commandLines.stream()
.filter(s -> s.length() > 0)//skip empty command line
.map(s -> { //map result of "filename" to filename
if (s.startsWith("\"") && s.endsWith("\"")) {
return s.substring(1, s.length() - 1);
} else {
return s;
}
})
.collect(Collectors.toList());
}
public static void main(String[] args) {
//console printed
// [H:\2019Summer\软件工程\任务.txt]
// [E:\info.xlsx]
System.out.println(getNotepadOpenedFiles());
System.out.println(getExcelOpenedFiles());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.