OpenFileDialog mostra sempre * .url (arquivos de atalho da Internet)
-
19-09-2019 - |
Pergunta
Meu OpenFileDialog
tem um único Filter
que é também o DefaultExt
. Eu me pergunto por que, quando o diálogo é aberta, eu também obter todos os atalhos da Internet listadas (que é OK para obter os atalhos para as pastas, por exemplo, mas não os arquivos * .url).
Existe alguma chave mágica que eu posso ligar, a fim de net obtê-los incluído na lista exibida para o usuário?
Atualmente, eu tenho que lidar com a condição no manipulador de eventos FileOk
definindo e.Cancel
para true
se eu detectar que o usuário selecionou um arquivo *.URL
(ele não está funcionando 100% do tempo, quer, alguns atalhos parecem ainda estar recebendo através do filtro FileOk
). Não fazê-los na lista em primeiro lugar seria melhor, no entanto.
Solução
Você está correto que diálogos comuns Abrir arquivo do Windows' mostrar atalhos da Internet, juntamente com pastas. Eu não tenho idéia por que existe esse comportamento, mas é lá- e isso acontece em Win32 (experimente o bloco de notas para verificar), bem como WinForms apps.
Há uma maneira de contornar isso, mas aviso: é hacky! Se você derivar uma classe de diálogo de arquivo de costume da classe FileDialog, você tem acesso a alguns eventos protegidos que você pode usar para personalizar cada aspecto da operação do FileDialog.
Dino Esposito escreveu um artigo MSDN Magazine em novembro de 2003 que mostra como esta técnica funciona. Este artigo não é mais no site do MSDN, mas você pode obtê-lo na wayback da máquina arquivar aqui: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx .
O que você provavelmente teria que fazer é ligar ou subclasse o WndProc da janela de ficheiros, manualmente olhar através do controle de lista de arquivos, identificar entradas que eram atalhos, e enviar mensagens do Windows para o controle de lista de arquivo para remover esses itens . Então você precisa prestar atenção para atualizações dessa lista (por exemplo, de uma mudança de diretório) e repita a operação de filtragem.
Este seria um grande corte, mas é possível.
Se isto é muito trabalho ou o hackiness é demais, eu sugiro apenas usando o evento FileOk para impedir que os usuários selecionar um atalho, devolvendo Cancel=true
do seu CancelEventHandler para o evento FileOk.
Outras dicas
Annoying. Você pode bater-los, implementando um manipulador para o evento FileOk de modo que o usuário nunca pode selecionar um:
private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
string ext = System.IO.Path.GetExtension(openFileDialog1.FileName);
if (String.Compare(ext, ".url", true) == 0) e.Cancel = true;
}