CodeItBetter Programming Another VB Programming Blog

How to clear Start Menu -> Run MRU list

Posted on January 4, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
'System & API - How to clear Start Menu -> Run MRU list
Option Explicit
 
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
    ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
    (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
    lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" _
    (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, _
    lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, _
    lpcbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
    (ByVal hKey As Long, ByVal lpValueName As String) As Long
 
Private Const ERROR_SUCCESS = 0&
 
Private Const HKEY_CURRENT_USER = &H80000001
 
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const SYNCHRONIZE = &H100000
Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or _
    KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And _
    (Not SYNCHRONIZE))
 
Private Sub Command1_Click()
    Dim hKey As Long
    Dim value_name_len As Long
    Dim value_name As String
    Dim value_data(1 To 1024) As Byte
    Dim value_data_len As Long
    Dim value_type As Long
    Dim value_data_string As String
    Dim i As Integer
 
    ' Open the key.
    If RegOpenKeyEx(HKEY_CURRENT_USER, _
        "Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU", 0&, _
        KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS Then
        MsgBox "Error opening key."
        Exit Sub
    End If
 
    ' Delete the key's values.
    Do
        value_name_len = 1024
        value_name = Space$(value_name_len)
        value_data_len = 1024
 
        If RegEnumValue(hKey, 0, value_name, value_name_len, 0, value_type, value_data(1), _
            value_data_len) <> ERROR_SUCCESS Then Exit Do
 
        ' Get the program name the slow way.
        value_data_string = ""
        For i = 1 To value_data_len - 1
            value_data_string = value_data_string & Chr$(value_data(i))
        Next i
        Debug.Print "Removing " & value_data_string
 
        ' Remove the value.
        value_name = Left$(value_name, value_name_len)
        RegDeleteValue hKey, value_name
    Loop
 
    ' Close the key.
    If RegCloseKey(hKey) <> ERROR_SUCCESS Then
        MsgBox "Error closing key."
    End If
 
    MsgBox "Done"
End Sub
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


 

No trackbacks yet.