在 java 中的 windows 下找到给定其 COMx 名称的 com 端口的 "FriendlyName"
Find the "FriendlyName" of a com port given its COMx name under windows in java
我需要根据 COM# 名称确定 COM 端口的 "friendly name"。
我找到了一些答案,但它们不是针对 C# 就是针对 C++。
java?
中有没有方法(可能是纯的)
经过长时间的搜索,我最终写下了以下似乎对我有用的 class;显然这是一个仅限 Win32 的东西。
希望对其他人有所帮助。
package registry;
import static com.sun.jna.platform.win32.WinReg.HKEY_LOCAL_MACHINE;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.Win32Exception;
public class FriendlyName {
private static final String ENUM = "SYSTEM\CurrentControlSet\Enum\USB";
private Map<String, String> friendlyNames;
private static final String KEY = "HARDWARE\DEVICEMAP\SERIALCOMM";
public FriendlyName() {
friendlyNames = new HashMap<>();
Pattern p = Pattern.compile(".*?\(([^)]+)\)");
for (String dev : Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE, ENUM)) {
String sb = ENUM + "\" + dev;
for (String itm : Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE, sb)) {
String si = sb + "\" + itm;
String fn = null;
try {
fn = Advapi32Util.registryGetStringValue(HKEY_LOCAL_MACHINE, si, "FriendlyName");
} catch (Win32Exception e) {}
if (fn != null) {
Matcher m = p.matcher(fn);
if (m.matches()) {
friendlyNames.put(m.group(1), fn);
}
}
}
}
}
String get(String key) {
return friendlyNames.get(key);
}
public String getCOM(String name) {
try {
for (Entry<String, Object> sub : Advapi32Util.registryGetValues(HKEY_LOCAL_MACHINE, KEY).entrySet()) {
String n = (String) sub.getValue();
String fn = get(n);
if (fn != null && fn.startsWith(name))
return n;
}
} catch (IllegalArgumentException e) {
System.err.println(e);
}
return null;
}
public static void main(String[] args) {
FriendlyName fn = new FriendlyName();
System.out.println(fn.getCOM(args[0]));
}
}
我需要根据 COM# 名称确定 COM 端口的 "friendly name"。
我找到了一些答案,但它们不是针对 C# 就是针对 C++。 java?
中有没有方法(可能是纯的)经过长时间的搜索,我最终写下了以下似乎对我有用的 class;显然这是一个仅限 Win32 的东西。
希望对其他人有所帮助。
package registry;
import static com.sun.jna.platform.win32.WinReg.HKEY_LOCAL_MACHINE;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.Win32Exception;
public class FriendlyName {
private static final String ENUM = "SYSTEM\CurrentControlSet\Enum\USB";
private Map<String, String> friendlyNames;
private static final String KEY = "HARDWARE\DEVICEMAP\SERIALCOMM";
public FriendlyName() {
friendlyNames = new HashMap<>();
Pattern p = Pattern.compile(".*?\(([^)]+)\)");
for (String dev : Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE, ENUM)) {
String sb = ENUM + "\" + dev;
for (String itm : Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE, sb)) {
String si = sb + "\" + itm;
String fn = null;
try {
fn = Advapi32Util.registryGetStringValue(HKEY_LOCAL_MACHINE, si, "FriendlyName");
} catch (Win32Exception e) {}
if (fn != null) {
Matcher m = p.matcher(fn);
if (m.matches()) {
friendlyNames.put(m.group(1), fn);
}
}
}
}
}
String get(String key) {
return friendlyNames.get(key);
}
public String getCOM(String name) {
try {
for (Entry<String, Object> sub : Advapi32Util.registryGetValues(HKEY_LOCAL_MACHINE, KEY).entrySet()) {
String n = (String) sub.getValue();
String fn = get(n);
if (fn != null && fn.startsWith(name))
return n;
}
} catch (IllegalArgumentException e) {
System.err.println(e);
}
return null;
}
public static void main(String[] args) {
FriendlyName fn = new FriendlyName();
System.out.println(fn.getCOM(args[0]));
}
}