Pregunta

Mi OpenFileDialog tiene una sola Filter que es también el DefaultExt. Me pregunto por qué, cuando se abre el cuadro de diálogo, también consigo todos los accesos directos de Internet listados (que está bien obtener los accesos directos a las carpetas, por ejemplo, pero no a los archivos * .url).

¿Hay algún interruptor mágico que puedo convertir en red con el fin de conseguirlos incluidos en la lista que se muestra al usuario?

Actualmente, tengo que manejar la condición del controlador de eventos FileOk estableciendo e.Cancel a true si detectan que el usuario ha seleccionado un archivo *.URL (que no está funcionando al 100% de las veces o bien, algunos accesos directos parecen aún por llegar a través del filtro FileOk). No obtener en la lista en el primer lugar sería mejor, sin embargo.

¿Fue útil?

Solución

Usted es correcto que abrir archivo diálogos comunes de Windows muestran accesos directos de Internet junto con las carpetas. No tengo ni idea de por qué existe este comportamiento, pero es allí- y sucede en Win32 (pruebe el Bloc de notas para verificar), así como aplicaciones Windows Forms.

Hay una manera de solucionar este problema, pero la advertencia: esto es hacky! Si usted deriva una clase de diálogo de archivo personalizado de la clase FileDialog, tendrá acceso a algunos eventos protegidas que se pueden utilizar para personalizar todos los aspectos de la operación del FileDialog.

Dino Esposito escribió un artículo MSDN Magazine en noviembre de 2003 que muestra cómo funciona esta técnica. Este artículo ya no está en el sitio de MSDN, pero se puede conseguir en el archivo de la máquina de Wayback aquí: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx .

Lo que probablemente tendría que hacer es conectar o subclase el WndProc de la ventana de archivos, de forma manual mirar a través del control de la lista de archivos, identificar las entradas que eran atajos, y enviar mensajes de Windows para el control de lista de archivos para eliminar los elementos . Entonces será necesario tener cuidado para actualizaciones de esa lista (por ejemplo, de un cambio de directorio) y repetir la operación de filtrado.

Esto sería un gran truco, pero es posible.

Si esto es demasiado trabajo o la hackiness es demasiado, me gustaría sugerir simplemente utilizando el evento FileOk para evitar que los usuarios seleccionar un acceso directo mediante la devolución de su Cancel=true CancelEventHandler para el evento FileOk.

Otros consejos

molesto. Puede golpear a ellas mediante la implementación de un controlador para el evento FileOk por lo que el usuario nunca puede seleccionar uno:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top