Manipulando a lista "Recent Projects" do Visual Studio

Algumas vezes eu faço uns projetos de teste no Visual Studio e a lista “Recent Projects” fica cheia de nomes como “ConsoleApplication1″, “WebSite1″. Eu gostaria de limpar, mas o VS não tem nada para apagar os nomes da lista.



Então resolvi dar uma pesquisada e verifiquei que esta lista fica em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList para o VS2008 e em HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList, nos valores File1, File2, File3,….

Assim, resolvi criar um pequeno programa que permite excluir arquivos desta lista para mim. Basta criar uma aplicação WinForms e colocar uma  ListView, com uma coluna, “Nome”. No evento Load usamos a classe Registry para ler os arquivos desta chave:


    private void Form1_Load(object sender, EventArgs e)
    {
      LeListaMru();
    }

    private void LeListaMru()
    {
      listView1.Items.Clear();
      // Abre chave do MRU do VS
      using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY))
      {
       // Pega lista de arquivos do MRU
        string[] arquivos = regKey.GetValueNames();
        foreach (string arq in arquivos)
        {
          // Adiciona nome do arquivo na ListView
          string keyValue = (string)regKey.GetValue(arq,””,RegistryValueOptions.DoNotExpandEnvironmentNames);
          if (keyValue != “”)
            listView1.Items.Add(Environment.ExpandEnvironmentVariables(keyValue)).Tag = keyValue;
        }
      }
    } 

Aqui, um pequeno truque: a lista é guardada com os nomes dos arquivos usando-se as variáveis de ambiente, como %USERPROFILE%, em chaves do tipo REG_EXPAND_SZ. Lemos as chaves sem expandi-las e adicionamos na lista, expandindo o nome usando ExpandEnvironmentVariables e guardamos o nome original no objeto Tag. Com isso, temos acesso ao nome expandido e não expandido.

Com a lista na janela, selecionamos os arquivos que queremos excluir e teclamos Del para exclui-los. No evento KeyDown da ListView excluimos os valores selecionados:

    private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
      // Se teclou Delete
      if (e.KeyCode == Keys.Delete &&
         MessageBox.Show(“Confirma exclusão dos projetos selecionados?”,
            “Exclui projetos”, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
      {
        // Abre chave do MRU do VS
        using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(MRUKEY,true))
        {
          // Apaga os valores atuais
        string[] arquivos = regKey.GetValueNames();
        foreach (string arq in arquivos)
              regKey.DeleteValue(arq);
          // Grava os valores só dos itens não selecionados
          int k = 1;
          foreach (ListViewItem item in listView1.Items)
            if (!item.Selected)
            {
              regKey.SetValue(string.Format(“File{0}”, k), (string)item.Tag, RegistryValueKind.ExpandString);
              k++;
            }
        }
        LeListaMru();
      }
    }

Aqui, uma observação: o Visual Studio não gosta de buracos na lista: se ele não encontrar o File2, ele despreza o restante da lista. Assim, o que fiz foi deletar toda a lista e só gravar os valores não selecionados, rearranjando-a. Com este pequeno programa, posso manipular a lista de projetos recentes do Visual Studio e deixá-la do jeito que quero.