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 emHKEY_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.
Obrigado pela dica, cara!
Foi muito útil!
Boa !