Как я могу запустить Steam для подключения к определенному серверу с помощью Java?
Когда вы вводите URL с этим форматом в ваш браузер:
steam://connect/[IP]
Steam автоматически запускается и подключается к указанному IP.
Как это может быть достигнуто в Java-программе, или как я могу перепроектировать это?
1 ответ
Это не вопрос Java обязательно.
Это скорее "Как настроить обработчик протокола URI", который зависит от системы и ОС.
В Windows вы бы сделали что-то похожее на это:
HKEY_CLASSES_ROOT
alert
(Default) = "URL:Alert Protocol"
URL Protocol = ""
DefaultIcon
(Default) = "alert.exe,1"
shell
open
command
(Default) = "C:\Program Files\Alert\alert.exe" "%1"
Это позволит вам открыть приложение Java, похожее на это:
java -jar MyJar.jar arg1 arg2
Смотрите больше здесь из Windows MSDN.
Чтобы сделать это прагматично, вам нужно использовать JNA для подключения к нативной библиотеке.
Хотя у Java SDK есть способ доступа к реестру, он объявлен закрытым. Вы могли бы использовать java.lang.Reflect
чтобы обойти это и получить доступ к этим закрытым методам, однако он может сломаться в любое время.
public class RegEdit {
private static Method regAddKey = null;
private static Method regSetVal = null;
private static Method regDeleteKey = null;
private static Method regDeleteValue = null;
private static final Preferences userRoot = Preferences.userRoot();
private static final Preferences systemRoot = Preferences.systemRoot();
private static final Class<? extends Preferences> userClass = userRoot.getClass();
public RegEdit() {
try {
regAddKey = userClass.getDeclaredMethod("WindowsRegCreateKeyEx", new Class[]{int.class, byte[].class});
regAddKey.setAccessible(true);
regSetVal = userClass.getDeclaredMethod("WindowsRegSetValueEx", new Class[]{int.class, byte[].class, byte[].class});
regSetVal.setAccessible(true);
regDeleteValue = userClass.getDeclaredMethod("WindowsRegDeleteValue", new Class[]{int.class, byte[].class});
regDeleteValue.setAccessible(true);
regDeleteKey = userClass.getDeclaredMethod("WindowsRegDeleteKey", new Class[]{int.class, byte[].class});
regDeleteKey.setAccessible(true);
} catch (NoSuchMethodException | SecurityException e) {
}
}
}
Надеюсь, это немного решит ваш вопрос.