Imports System.IO Imports System.Diagnostics Imports System.Xml Imports System.Text Imports System.Drawing Imports System.Runtime.InteropServices PublicClass MainFrmClass MainFrm Dim ComAppPath AsString Dim XMLFilePath AsString Dim XmlDoc As XmlDocument Dim Root, Node As XmlNode Dim Element As XmlElement Dim NodeList As XmlNodeList Dim LtItem As ListViewItem Dim PrgName, PrgPath AsString Dim SmFrmHeight AsInteger=405 Dim LgFrmHeight AsInteger PrivateSub MainFrm_Load()Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load LgFrmHeight =Me.Height Me.Height = SmFrmHeight ComAppPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) XMLFilePath = Path.Combine(ComAppPath, "MyIMAppList.xml") If File.Exists(XMLFilePath) Then LoadXml2List(XMLFilePath) EndIf End Sub PrivateSub LoadXml2List()Sub LoadXml2List(ByVal XmlFilePath AsString) Dim iconIndex AsInteger=0 XmlDoc =New XmlDocument XmlDoc.Load(XmlFilePath) Root = XmlDoc.SelectSingleNode("AppList") NodeList = Root.ChildNodes Me.Lv1.Items.Clear() Me.ImgLstLg.Images.Clear() If NodeList.Count >0Then ForEach Node In NodeList PrgName = Node.FirstChild.InnerText PrgPath = Node.LastChild.InnerText LtItem =New ListViewItem LtItem.Text = PrgName LtItem.SubItems.Add(PrgPath) LtItem.ImageIndex = iconIndex Me.ImgLstLg.Images.Add(IconExtractor.GetLargeIcon(PrgPath)) Me.Lv1.Items.Add(LtItem) iconIndex +=1 Next EndIf End Sub PrivateSub SaveXMLFile()Sub SaveXMLFile(ByVal XmlFilePath AsString) Dim NewXML AsNew XmlTextWriter(XmlFilePath, Encoding.UTF8) NewXML.WriteStartDocument() NewXML.Formatting = Formatting.Indented NewXML.WriteStartElement("AppList") NewXML.WriteAttributeString("Name", "常用程序列表") For i AsInteger=0ToMe.Lv1.Items.Count -1 LtItem =Me.Lv1.Items(i) NewXML.WriteStartElement("App") NewXML.WriteElementString("Name", LtItem.Text) NewXML.WriteElementString("Path", LtItem.SubItems.Item(1).Text) NewXML.WriteEndElement() Next NewXML.WriteEndElement() NewXML.WriteEndDocument() NewXML.Close() End Sub PrivateSub Lv1_DragEnter()Sub Lv1_DragEnter(ByVal sender AsObject, ByVal e As System.Windows.Forms.DragEventArgs) Handles Lv1.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.All EndIf End Sub PrivateSub Lv1_DragDrop()Sub Lv1_DragDrop(ByVal sender AsObject, ByVal e As System.Windows.Forms.DragEventArgs) Handles Lv1.DragDrop If e.Data.GetDataPresent(DataFormats.FileDrop) Then Dim MyFiles() AsString Dim i AsInteger MyFiles = e.Data.GetData(DataFormats.FileDrop) For i =0To MyFiles.Length -1 PrgName = Path.GetFileNameWithoutExtension(MyFiles(i)) PrgPath = MyFiles(i) LtItem =New ListViewItem LtItem.Text = PrgName LtItem.SubItems.Add(PrgPath) LtItem.ImageIndex =Me.ImgLstLg.Images.Count Me.ImgLstLg.Images.Add(IconExtractor.GetLargeIcon(PrgPath)) Me.Lv1.Items.Add(LtItem) Next EndIf End Sub PrivateSub Lv1_DoubleClick()Sub Lv1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Lv1.DoubleClick IfMe.Lv1.SelectedItems.Count >0Then Dim AppPathStr AsString=Me.Lv1.SelectedItems(0).SubItems.Item(1).Text If File.Exists(AppPathStr) Then System.Diagnostics.Process.Start(AppPathStr) EndIf EndIf End Sub PrivateSub Lv1_SelectedIndexChanged()Sub Lv1_SelectedIndexChanged(ByVal sender AsObject, ByVal e As System.EventArgs) Handles Lv1.SelectedIndexChanged IfMe.Lv1.SelectedItems.Count >0Then LtItem =Me.Lv1.SelectedItems(0) Me.TBoxPName.Text = LtItem.Text '=LtItem.SubItems.Item(0).Text Me.TBoxPPaths.Text = LtItem.SubItems.Item(1).Text '为第二项 EndIf End Sub PrivateSub Lv1_KeyDown()Sub Lv1_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Lv1.KeyDown If e.KeyCode = Keys.Enter Then IfMe.Lv1.SelectedItems.Count >0Then Dim AppPathStr AsString=Me.Lv1.SelectedItems(0).SubItems.Item(1).Text If File.Exists(AppPathStr) Then System.Diagnostics.Process.Start(AppPathStr) EndIf EndIf ElseIf e.KeyCode = Keys.Delete Then IfMe.Lv1.SelectedItems.Count >-1Then Me.Lv1.Items.RemoveAt(Me.Lv1.SelectedIndices(0)) EndIf EndIf End Sub PrivateSub BtClearList_Click()Sub BtClearList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtClearList.Click IfMsgBox("是否清空列表里面是所有数据,清空后要保存列表才生效!", MsgBoxStyle.YesNo, "清空列表") = MsgBoxResult.Yes Then Me.Lv1.Items.Clear() EndIf End Sub PrivateSub BtExportList_Click()Sub BtExportList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtExportList.Click If File.Exists(XMLFilePath) Then Dim SaveFD AsNew SaveFileDialog Dim DlogRs As DialogResult With SaveFD .Filter ="XML文件(*.xml)|*.xml" .Title ="导出常用程序列表" .DefaultExt =".xml" .InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) .FileName ="常用程序列表" DlogRs = .ShowDialog() EndWith If DlogRs = Windows.Forms.DialogResult.OK Then File.Copy(XMLFilePath, SaveFD.FileName, True) MsgBox("列表内容已经导出!", , "导出成功") EndIf EndIf End Sub PrivateSub BtImportList_Click()Sub BtImportList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtImportList.Click Dim OpenFD AsNew OpenFileDialog Dim DlogRs As DialogResult Dim NewFPath AsString="" Dim IsMyFile AsBoolean=False With OpenFD .Filter ="XML文件(*.xml)|*.xml" .Title ="选择导入常用程序列表的XML文件" .DefaultExt =".xml" .InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) .FileName ="常用程序列表" DlogRs = .ShowDialog() EndWith If DlogRs = Windows.Forms.DialogResult.OK Then NewFPath = OpenFD.FileName '1.判断文件内容是否有效----读取方法一 'Dim xReader As XmlReader 'Dim Xx As String 'xReader = XmlReader.Create(NewFPath) 'xReader.ReadToFollowing("AppList") 'If xReader.HasAttributes Then ' xReader.MoveToFirstAttribute() ' Xx = xReader.Value ' xReader.MoveToElement() ' If Xx = "常用程序列表" Then ' MsgBox("1有效") ' End If 'End If '1.判断文件内容是否有效----读取方法二 Dim IXmlDoc AsNew XmlDocument Dim IRoot As XmlNode Dim INodeList As XmlNodeList Dim INode As XmlNode IXmlDoc.Load(NewFPath) IRoot = IXmlDoc.SelectSingleNode("AppList") If IRoot.Attributes("Name").Value.ToString ="常用程序列表"Then IsMyFile =True Else IsMyFile =False EndIf '2.追加或重新加载xml文件数据到列表中 '这里选择追加. If IsMyFile Then IfMe.Lv1.Items.Count >0Then Dim IconIndex AsInteger=Me.Lv1.Items.Count INodeList = IRoot.ChildNodes If NodeList.Count >0Then ForEach INode In INodeList LtItem =New ListViewItem LtItem.Text = INode.FirstChild.InnerText LtItem.SubItems.Add(INode.LastChild.InnerText) LtItem.ImageIndex = IconIndex Me.ImgLstLg.Images.Add(IconExtractor.GetLargeIcon(INode.LastChild.InnerText)) Me.Lv1.Items.Add(LtItem) IconIndex +=1 Next EndIf Else File.Copy(NewFPath, XMLFilePath, True) LoadXml2List(XMLFilePath) EndIf EndIf EndIf End Sub PrivateSub BtAdd_Click()Sub BtAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtAdd.Click Me.TBoxPName.Text ="" Me.TBoxPPaths.Text ="" Me.TBoxPName.Focus() End Sub PrivateSub BtSave_Click()Sub BtSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtSave.Click IfMe.TBoxPName.Text >""AndMe.TBoxPPaths.Text >""Then If File.Exists(Me.TBoxPPaths.Text) Then PrgName =Me.TBoxPName.Text PrgPath =Me.TBoxPPaths.Text LtItem =New ListViewItem LtItem.Text = PrgName LtItem.SubItems.Add(PrgPath) LtItem.ImageIndex =Me.ImgLstLg.Images.Count Me.ImgLstLg.Images.Add(IconExtractor.GetLargeIcon(PrgPath)) Me.Lv1.Items.Add(LtItem) EndIf EndIf End Sub PrivateSub BtSaveList2Xml_Click()Sub BtSaveList2Xml_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtSaveList2Xml.Click IfMe.Lv1.Items.Count >0Then SaveXMLFile(XMLFilePath) MsgBox("保存成功!", , "保存列表") Else If File.Exists(XMLFilePath) Then File.Delete(XMLFilePath) MsgBox("保存成功!", , "保存列表") EndIf EndIf End Sub PrivateSub BtDelete_Click()Sub BtDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtDelete.Click IfMe.Lv1.SelectedItems.Count >0Then Me.Lv1.Items.RemoveAt(Me.Lv1.SelectedIndices(0)) EndIf End Sub PrivateSub BtStartApp_Click()Sub BtStartApp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtStartApp.Click IfMe.TBoxPPaths.Text >""Then Dim AppPathStr AsString=Me.TBoxPPaths.Text If File.Exists(AppPathStr) Then System.Diagnostics.Process.Start(AppPathStr) EndIf EndIf End Sub PrivateSub BtShowInfo_Click()Sub BtShowInfo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtShowInfo.Click Me.BtShowInfo.Text =IIf(Me.BtShowInfo.Text ="说明>>", "说明<<", "说明>>") Me.Height =IIf(Me.Height = SmFrmHeight, LgFrmHeight, SmFrmHeight) End Sub PrivateSub BtClose_Click()Sub BtClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtClose.Click Application.Exit() End Sub End Class PublicClass IconExtractorClass IconExtractor PrivateConst SHGFI_SMALLICON =&H1 PrivateConst SHGFI_LARGEICON =&H0 PrivateConst SHGFI_ICON =&H100 PrivateConst SHGFI_USEFILEATTRIBUTES =&H10 PrivateConst MAX_SIZE =260 PublicEnum IconSizeEnum IconSize Icon = SHGFI_ICON SmallIcon = SHGFI_SMALLICON LargeIcon = SHGFI_LARGEICON End Enum <StructLayout(LayoutKind.Sequential)> _ PrivateStructure SHFILEINFOStructure SHFILEINFO 'pointer to icon handle Public hIcon As IntPtr 'icon index Public iIcon AsInteger 'not used in this example Public dwAttributes AsInteger 'file pathname--marshal this as an unmanaged LPSTR of MAX_SIZE=260 <MarshalAs(UnmanagedType.LPStr, SizeConst:=260)> _ Public szDisplayName AsString 'file type--marshal as unmanaged LPSTR of 80 chars <MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> _ Public szTypeName AsString End Structure PrivateDeclareAutoFunction SHGetFileInfo()Function SHGetFileInfo Lib"shell32" (ByVal pszPath AsString, ByVal dwFileAttributes AsInteger, ByRef psfi As SHFILEINFO, _ ByVal cbFileInfo AsInteger, ByVal uFlags AsInteger) AsInteger PublicSharedFunction GetIcon()Function GetIcon(ByVal FileName AsString) As System.Drawing.Icon Return GetIconApi(FileName, IconSize.Icon) End Function PublicSharedFunction GetSmallIcon()Function GetSmallIcon(ByVal fn AsString) As System.Drawing.Icon Return GetIconApi(fn, SHGFI_SMALLICON) End Function PublicSharedFunction GetLargeIcon()Function GetLargeIcon(ByVal fn AsString) As System.Drawing.Icon Return GetIconApi(fn, SHGFI_LARGEICON) End Function PrivateSharedFunction GetIconApi()Function GetIconApi(ByVal fn AsString, ByVal anIconSize AsInteger) As System.Drawing.Icon Dim aSHFileInfo AsNew SHFILEINFO() Dim cbFileInfo AsInteger= Marshal.SizeOf(aSHFileInfo) Dim uflags AsInteger= SHGFI_ICON Or SHGFI_USEFILEATTRIBUTES Or anIconSize Try SHGetFileInfo(fn, 0, aSHFileInfo, cbFileInfo, uflags) Return Icon.FromHandle(aSHFileInfo.hIcon) Catch ex As Exception ReturnNothing EndTry End Function End Class