Hello.
How to programmatically add an exe-file to autoload if using win xp?
You can add a file to autoload using the Windows registry
The easiest way to work in the java language with the windows registry is using external programs that are already built into this operating system.
package up7; import java.io.*; public class Up7 { private static void readWinReg (String zn) throws Exception{ Runtime rt = Runtime.getRuntime(); Process proc = null; try { proc = rt.exec("cmd"); } catch (Exception exc){ System.out.println("Консоль не запущена"); } BufferedReader bfIn = new BufferedReader(new InputStreamReader(proc.getInputStream(), "UTF-8")); BufferedWriter bfOut = new BufferedWriter (new OutputStreamWriter (proc.getOutputStream(), "UTF-8")); int ir=0; while ( (ir = bfIn.read()) != 62 ) { System.out.print((char) ir); } System.out.print((char) ir); bfOut.write("reg query " + zn + " /s"); bfOut.newLine(); bfOut.flush(); while ( (ir = bfIn.read()) != 62 ) { System.out.print((char) ir); } } private static void addWinReg (String zn, String zn2, String zn3) { String s = "cmd /C " + "reg add " + zn + " /v " + zn2 + " /t REG_SZ /d " + "\"" + zn3 + "\""; try { Runtime.getRuntime().exec(s); } catch(Exception ex){ex.printStackTrace();} } private static void delWinReg (String zn, String zn2) { String s = "cmd /C " + "reg delete " + zn + " /v " + zn2 + " /f\r\n"; try { Runtime.getRuntime().exec(s); } catch(Exception ex){ex.printStackTrace();} } public static void main(String[] args) throws Exception { String rees = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Intel\\Audio"; String rees2 = "name"; String rees3 = "value"; addWinReg (rees, rees2, rees3); readWinReg (rees); delWinReg (rees, rees2); readWinReg (rees); } } working with the win registry in java using reg
And it is also possible to work with the win registry using Java JNA (Java Native Access)
public static String getStrRegKey(WinReg.HKEY rootKey, String regKey, String keyName) { //создаем основной указатель типа HKEY (хендлер) на ключ реестра, // с которым будем работать дальше WinReg.HKEYByReference phKey = new WinReg.HKEYByReference(); //открываем доступ к разделу HKCU - HKEY_CURRENT_USER // в данном методе (для простоты) работаем только с этим разделом if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegOpenKeyEx( rootKey, regKey, 0, WinNT.KEY_READ, phKey)) { //если доступ в раздел получен - получен и хендлер к раздела - phKey //заводим парочку необходимых указателей на данные, которые должны получить, //обратившись к следующей функции API IntByReference lpcbData = new IntByReference(); IntByReference lpType = new IntByReference(); //вызываем функцию получения данных по ключу реестра из открытого раздела, //но пока только с целью получения информации о наличии этих данных и о //типе данных, хранимых там if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegQueryValueEx( phKey.getValue(), keyName, 0, lpType, (char[]) null, lpcbData) ) { //если данные есть и тип их строковый - на этот раз запрашиваются //реальные данные, которые будут получены в символьном буфере, который //резервирует место в памяти под реальный полученный размер информации if ((WinNT.REG_SZ == lpType.getValue()) && ((lpcbData.getValue() > 0))) { char[] buffer = new char[lpcbData.getValue()]; if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegQueryValueEx( phKey.getValue(), keyName, 0, lpType, buffer, lpcbData) ) { //если данные благополучно получены - закрываем ключ реестра Advapi32.INSTANCE.RegCloseKey(phKey.getValue()); //в приемном буфере лежит нуль-строка, её надо превратить в //"нормальную строку"; return Native.toString(buffer); } } } } return ""; } public static boolean putStrRegKey(WinReg.HKEY rootKey, String regKey, String keyName, String strValue) { //создаем основной указатель типа HKEY (хендлер) на ключ реестра, // с которым будем работать дальше WinReg.HKEYByReference phKey = new WinReg.HKEYByReference(); //открываем доступ к разделу HKCU - HKEY_CURRENT_USER // в данном методе (для простоты) работаем только с этим разделом if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegOpenKeyEx( rootKey, regKey, 0, WinNT.KEY_WRITE | WinNT.KEY_READ, phKey)) { //если доступ в раздел получен - получен и хендлер к раздела - phKey //записываем пару ключ - REG_SZ значение char[] lpData = Native.toCharArray(strValue); if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegSetValueEx( phKey.getValue(), keyName, 0, WinNT.REG_SZ, lpData, lpData.length * 2)) { //для проверки перечитаем записанное IntByReference lpcbData = new IntByReference(); IntByReference lpType = new IntByReference(); //вызываем функцию получения данных по ключу реестра из открытого раздела, //но пока только с целью получения информации о наличии этих данных и о //типе данных, хранимых там if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegQueryValueEx( phKey.getValue(), keyName, 0, lpType, (char[]) null, lpcbData) ) { //если данные есть и тип их строковый - на этот раз запрашиваются //реальные данные, которые будут получены в символьном буфере, который //резервирует место в памяти под реальный полученный размер информации if ((WinNT.REG_SZ == lpType.getValue()) && ((lpcbData.getValue() > 0))) { char[] buffer = new char[lpcbData.getValue()]; if (W32Errors.ERROR_SUCCESS == Advapi32.INSTANCE.RegQueryValueEx( phKey.getValue(), keyName, 0, lpType, buffer, lpcbData) ) { //если данные благополучно получены - закрываем ключ реестра Advapi32.INSTANCE.RegCloseKey(phKey.getValue()); //в приемном буфере лежит нуль-строка, её надо превратить в //"нормальную строку" String iStr = Native.toString(buffer); //проверяем записанное и прочитанное return (Objects.equals(iStr, strValue)); } } } } } return false; } working with the win registry using Java JNA (Java Native Access)
Ways where there is autoload in the Windows registry
HKEY_LOCAL_MASHINE\SOFTWARE\MICROSOFT\WINDOWS\CurrentVresion\Run *\RunOnce *\RunOnceEx А так же в ветке HKEY_CURRENT_USER Source: https://ru.stackoverflow.com/questions/599006/
All Articles