Pegar Lista de Programas Instalados no Windows

Tem como pegar a lista de programas instalados no Windows através do Java?
Eu quero listar todos eles assim como aparecem no recurso do windows que fica em
Painel de Controle\Programas\Programas e Recursos

Obs: eu sei que o Java não foi feito com esse propósito e também sei que as informações estão localizadas nos registros do windows

Geralmente, no Windows os programas ficam instalados C:/Arquivo de programas/Nome do programa, com Nome do programa sendo um diretório.
Poderia ler todos os diretórios que estão na pasta arquivo de programas e lista-los.

Veja a API https://sourceforge.net/projects/jregistrykey/ para acesso ao registro. O exemplo é:

import java.io.File;
import java.util.Iterator;

import ca.beq.util.win32.registry.RegistryKey;
import ca.beq.util.win32.registry.RootKey;

public class Test {

    public static void main(String... args) throws Exception {
        RegistryKey.initialize(Test.class.getResource("jRegistryKey.dll").getFile());
        RegistryKey key = new RegistryKey(RootKey.HKLM, "Software\Microsoft\Windows\CurrentVersion\Uninstall");
        for (Iterator<RegistryKey> subkeys = key.subkeys(); subkeys.hasNext();) {
            RegistryKey subkey = subkeys.next();
            System.out.println(subkey.getName()); // deve imprimir os programas instalados. 
        }
    }
}

A chave de registro para programas instalados é HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Fonte: http://stackoverflow.com/questions/2439984/how-to-check-if-a-program-is-installed-on-windows-system e http://stackoverflow.com/questions/11538672/getting-the-list-of-softwares-installed-using-java-on-a-computer .

Abraço.

Obrigado pelas repostas!!

TerraSkill, eu utilizei esse código que você me indicou, porém não estou conseguindo acessar, acho que dá algum erro em relação ao local da dll. Eu coloquei ela na mesma pasta que esta classe.
Eu pesquisei em alguns locais e haviam algumas indicações que seriam a versão do sistema.
No meu caso uso Windows 10 64-bit. Ps: Já tentei também iniciar como administrador!

Linha que gera o erro:
RegistryKey key = new RegistryKey(RootKey.HKLM, “Software\Microsoft\Windows\CurrentVersion\Uninstall”);

Erro:

Exception in thread “main” java.lang.UnsatisfiedLinkError: ca.beq.util.win32.registry.RegistryKey.testInitialized()V
at ca.beq.util.win32.registry.RegistryKey.testInitialized(Native Method)
at ca.beq.util.win32.registry.RegistryKey.initialize(RegistryKey.java:294)
at testt.test.main(test.java:12)

alguém?

Pelo que vi no site do jRegistryKey, há mesmo esse problema com Windows 64 bits. Nesse caso, não sei o que te sugerir. Dê uma olhada no segundo link do StackOverflow, que tenta fazer com Runtime.exec.

Se puder usar alguma outra linguagem (como C++), talvez usando a API do Windows você consiga obter essa informação. Você poderia criar sua própria dll ou um executável que sua aplicação Java poderia chamar e que retorne esse conteúdo em um arquivo texto por exemplo.

Abraço.

eu tentei usar a API do JNA, porém quando pesquiso na pasta do HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall ele estranhamente não pega todos os programas exatamente como na Tela do Programas e recursos