从Java获取MS Windows安装的应用程序

从Java获取MS Windows安装的应用程序,java,Java,是否可以从使用java的windows vista计算机上获取已安装应用程序的列表(如un install programs中的列表)?如果您是指已安装的应用程序,我认为直接使用java SDK是不可能的(还因为这不是跨平台的要求)。。我认为您可以使用外部本机API与windows注册表(如)交互,并检索所需信息 相反,如果您想从Java程序中获取所有正在运行的应用程序,您可以按说明解析tasklist.exe输出。这不是一个解决方案,而是一个解决方法 如果不支持外部API,则无法使用java

是否可以从使用java的windows vista计算机上获取已安装应用程序的列表(如un install programs中的列表)?

如果您是指已安装的应用程序,我认为直接使用java SDK是不可能的(还因为这不是跨平台的要求)。。我认为您可以使用外部本机API与windows注册表(如)交互,并检索所需信息


相反,如果您想从Java程序中获取所有正在运行的应用程序,您可以按说明解析
tasklist.exe
输出。

这不是一个解决方案,而是一个解决方法

如果不支持外部API,则无法使用java SDK获取windows本机信息。我们可以使用shell命令来获得相同的API,而不是使用外部API(大部分是LGPL许可的,并且不是完全开放的)

要获取已安装软件列表,请使用ProcessBuilder或Runtime.exec运行以下PowerShell命令之一:

  • 获取WmiObject-class Win32|U产品|选择对象-属性名称
    -这稍微慢一点!它使用Win32_产品类
  • 获取ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*|选择对象DisplayName、DisplayVersion、Publisher、InstallDate
    -这更快,可以提供更多详细信息。这使用PS注册表提供程序
  • 您可以流式处理这些文件的输出并对其进行处理

    根据我的分析,这只是一个解决办法。由于java完全独立于平台,获取本机信息变得困难,必须使用平台本机工具(如command shell、power shell等)。

    package Vishal;
    
    package Vishal;
    
    import com.sun.jna.platform.win32.Advapi32Util;
    import static com.sun.jna.platform.win32.WinReg.HKEY_LOCAL_MACHINE;
    import java.util.ArrayList;
    import java.util.TreeMap;
    
    public class GenerateInstalledApplicationList 
    {
        ArrayList<String> getlist()
        {
            ArrayList<String> arr = new ArrayList();
            String [] keys = Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
        String temp;
        for (String key : keys) 
        {
            temp = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" + "\\" +key;
            TreeMap<String, Object> tr = Advapi32Util.registryGetValues(HKEY_LOCAL_MACHINE,temp); 
            if(tr.isEmpty())
            {
                if(!key.contains("Update"))//all the instances of update are not actually installed applications
                {
                arr.add(key);
                }
            }
            else
            {
                if(tr.containsKey("DisplayName"))
                {
                    String str = (String) tr.get("DisplayName");
                    if(!str.contains("Update"))
                    {
                    arr.add(str);
                    }
                }
            }     
        }
        return arr;
       }}
    
    导入com.sun.jna.platform.win32.Advapi32Util; 导入静态com.sun.jna.platform.win32.WinReg.HKEY\u LOCAL\u机器; 导入java.util.ArrayList; 导入java.util.TreeMap; 公共类GenerateInstalledApplicationList { ArrayList getlist() { ArrayList arr=新的ArrayList(); String[]keys=Advapi32Util.registryGetKeys(HKEY_LOCAL_MACHINE,“软件\\Microsoft\\Windows\\CurrentVersion\\Uninstall”); 字符串温度; 用于(字符串键:键) { temp=“Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall”+“\\\”+键; TreeMap tr=Advapi32Util.registryGetValues(HKEY_LOCAL_MACHINE,temp); if(tr.isEmpty()) { if(!key.contains(“Update”)//所有更新实例都不是实际安装的应用程序 { arr.add(键); } } 其他的 { if(tr.containsKey(“DisplayName”)) { String str=(String)tr.get(“DisplayName”); 如果(!str.contains(“更新”)) { arr.add(str); } } } } 返回arr; }}
    只需复制并粘贴此代码,它将返回所有已安装的应用程序
    您唯一需要的是JNAAPI。

    您所说的“应用程序列表”是什么意思?我想他指的是任务管理器中列出的正在运行的应用程序列表。当你想卸载某个程序时,该列表或列出的已安装程序列表。投票以“不是真正的问题”结束Rafiq,请解释“应用程序列表”@Rafiq是什么意思,当然是@杰克的回答说明了一切。如果你能用C从windows vista中获得应用程序列表,那么你就可以用java获得它。您可能需要通过JNI API访问列表。第二个命令不应该是
    Get ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*|选择对象DisplayName、DisplayVersion、Publisher、InstallDate
    ?是的,谢谢!!打字错误。命令是1。“获取WMIOObject-class Win32_Product |选择Object-Property Name”(这稍微慢一点!它使用Win32_Product class)。2.获取ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall*|选择对象DisplayName、DisplayVersion、Publisher、InstallDate