Как я могу запустить 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) {
        }
    }
}

Надеюсь, это немного решит ваш вопрос.

Другие вопросы по тегам