Windows Mobile 6.5 的蜂窝菜单如果要自定义排序非常麻烦,需要设置移动到顶部或者修改注册表中的 Rank 值的大小来排序,两种方法都不能方便的排列为自己想要的顺序,于是就自己写一个程序来修改注册表,这样就可以直观一些。
程序主要是修改注册表中 HKEY_LOCAL_MACHINE\Security\Shell\StartInfo\Start\ 下面项目中的 Rank 值,首先把注册表中的项目读出来放到一个 DataTable 中,然后排序后再绑定到 ListBox 中,最后通过交换选中项目和要移动的目标项中的 Rank 值来达到排序的目的。

把注册表读到 DataTable 中

Code

Function GetReg()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

对项目进行排序

Code
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

源码下载