我想要的是这个程序要在"安装"中显示Microsoft Outlook 2010。列表框是否已安装且未安装""如果没有安装。 " ListBox1中"在表单加载中包含所有已安装应用程序的列表。
问题在于它确实适用于"已安装的"部分,它在"未安装"中列出了应用程序多次。框。我只希望它出现一次。
Private Sub Form1_Load(sender as Object,e As EventArgs)处理MyBase.Load
Dim regkey, subkey As Microsoft.Win32.RegistryKey
Dim value As String
Dim regpath As String = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
regkey = My.Computer.Registry.LocalMachine.OpenSubKey(regpath)
Dim subkeys() As String = regkey.GetSubKeyNames
Dim includes As Boolean
For Each subk As String In subkeys
subkey = regkey.OpenSubKey(subk)
value = subkey.GetValue("DisplayName", "")
If value <> "" Then
includes = True
If value.IndexOf("Hotfix") <> -1 Then includes = False
If value.IndexOf("Security Update") <> -1 Then includes = False
If value.IndexOf("Update for") <> -1 Then includes = False
If includes = True Then ListBox1.Items.Add(value)
End If
Next
Dim count As Integer = (ListBox1.Items.Count - 1)
Dim words As String
Dim softName As String
softName = "Microsoft Outlook 2010"
For a = 0 To count
words = ListBox1.Items.Item(a)
If InStr(words.ToLower, softName.ToLower) Then
Installed.Items.Add(words)
Else
NotInstalled.Items.Add(softName)
End If
Next
答案 0 :(得分:0)
重复字符串是由于为检查的每个项目调用NotInstalled.Items.Add(softName)
而导致的简单错误。您可能只想在循环结束时添加它。
但是,您可以使用Linq
来简化代码Dim result = words.Where(Function(x) x.ToLower().IndexOf("microsoft outlook 2010") >= 0)
if result IsNot Nothing then
Installed.Items.AddRange(result.ToArray)
else
NotInstalled.Items.Add(softName)
end if
但是你应该考虑代码中的一些问题。如果Outlook作为Office的一部分安装,则卸载部分中没有该条目。如果您在64位系统上运行,则存在自动重定向到注册表的不同部分的问题。如果您的Outlook是64位系统上安装的32位版本并且您的应用程序在AnyCPU模式下运行怎么办?考虑到所有这些可能性并不是一项微不足道的任务。只是为了警告你
答案 1 :(得分:0)
我认为你应该尝试类似的东西。 (我是一个c#家伙,所以我希望我的语法是正确的。)
Dim isOutlookInstalled = False
softName = "Microsoft Outlook 2010"
For a = 0 To count
words = ListBox1.Items.Item(a)
If InStr(words.ToLower, softName.ToLower) Then
Installed.Items.Add(words)
End If
Next
If isOutlookInstalled <> True
NotInstalled.Items.Add(softName)
End If