Windows Mobile 6.5 蜂窝菜单排序工具

发布时间: 2009/5/27 22:10:48

Windows Mobile 6.5 的蜂窝菜单如果要自定义排序非常麻烦,需要设置移动到顶部或者修改注册表中的 Rank 值的大小来排序,两种方法都不能方便的排列为自己想要的顺序,于是就自己写一个程序来修改注册表,这样就可以直观一些。

程序主要是修改注册表中 HKEY_LOCAL_MACHINE\Security\Shell\StartInfo\Start\ 下面项目中的 Rank 值,首先把注册表中的项目读出来放到一个 DataTable 中,然后排序后再绑定到 ListBox 中,最后通过交换选中项目和要移动的目标项中的 Rank 值来达到排序的目的。

把注册表读到 DataTable 中


    Function GetReg() As DataView
        
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("Security\Shell\StartInfo\Start")
        
If regKey Is Nothing Then
            
Exit Function
        
End If
        
Dim dt As New DataTable("Menu")
        dt.Columns.Add(
"Name", System.Type.GetType("System.String"))
        dt.Columns.Add(
"Rank", System.Type.GetType("System.Int64"))
        dt.Columns.Add(
"Favorite", System.Type.GetType("System.Boolean"))
        dt.Columns.Add(
"FavoriteOrder", System.Type.GetType("System.Object"))
        
For Each key As String In regKey.GetSubKeyNames
            
Dim file As String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.StartMenu) & "\程序\" & key
            
If Not key.EndsWith(".lnk"OrElse IO.File.Exists(file) Then
                
Dim rk As RegistryKey = Registry.LocalMachine.OpenSubKey("Security\Shell\StartInfo\Start\" & key)
                
Dim Rank As Long = rk.GetValue("Rank")
                
Dim Favorite As Boolean = rk.GetValue("Favorite")
                
Dim FavoriteOrder As Byte() = rk.GetValue("FavoriteOrder")
                
Dim row As DataRow = dt.NewRow
                row(
"Name"= key
                row(
"Rank"= Rank
                row(
"Favorite"= Favorite
                row(
"FavoriteOrder"= FavoriteOrder
                dt.Rows.Add(row)
            
End If
        
Next
        
Dim dv As New DataView
        dv.Table 
= dt
        dv.Sort 
= "Favorite DESC, FavoriteOrder DESC, Rank DESC, Name ASC"
        
Return dv
    
End Function

 

对项目进行排序


            Dim drv As DataRowView = CType(Me.ListBox1.SelectedItem, DataRowView)
            
Dim drv2 As DataRowView = CType(Me.ListBox1.Items.Item(Me.ListBox1.SelectedIndex + 1), DataRowView)
            
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("Security\Shell\StartInfo\Start\" & drv("Name"), True)
            
Dim regKey2 As RegistryKey = Registry.LocalMachine.OpenSubKey("Security\Shell\StartInfo\Start\" & drv2("Name"), True)

            
Dim Rank As Long = regKey.GetValue("Rank")
            
Dim Rank2 As Long = regKey2.GetValue("Rank")
            
If Rank = Rank2 Then Rank2 = Rank2 - 1
            regKey.SetValue(
"Rank", Rank2, RegistryValueKind.DWord)
            regKey2.SetValue(
"Rank", Rank, RegistryValueKind.DWord)

            
Dim Favorite As Boolean = regKey.GetValue("Favorite")
            
Dim Favorite2 As Boolean = regKey2.GetValue("Favorite")
            
Dim FavoriteOrder As Byte() = regKey.GetValue("FavoriteOrder")
            
Dim FavoriteOrder2 As Byte() = regKey2.GetValue("FavoriteOrder")
            
If Favorite <> Favorite2 Then
                regKey.SetValue(
"Favorite", Favorite2, RegistryValueKind.DWord)
                regKey2.SetValue(
"Favorite", Favorite, RegistryValueKind.DWord)
                regKey2.SetValue(
"FavoriteOrder", FavoriteOrder, RegistryValueKind.Binary)
                regKey.DeleteValue(
"FavoriteOrder")
            
End If

            
If Favorite AndAlso Favorite2 Then
                regKey.SetValue(
"FavoriteOrder", FavoriteOrder2, RegistryValueKind.Binary)
                regKey2.SetValue(
"FavoriteOrder", FavoriteOrder, RegistryValueKind.Binary)
            
End If
赞助商