Obtenir le vrai nom du fichier actuellement sélectionnée dans la boîte de dialogue de fichier commun?

StackOverflow https://stackoverflow.com/questions/1757093

Question

On peut obtenir le texte de l'élément sélectionné dans la liste vue d'un dialogue commun. Mais on ne peut pas obtenir son PIDL, et si l'utilisateur a choisi de masquer les extensions connues (par défaut), alors on ne peut pas vraiment dire ce dossier a été sélectionné sans soit son extension ou son PIDL.

Donc les moyens possibles pour résoudre ce pourrait être:

  1. Obtenir une IShellView de la dialogue standard de fichier ouvert. le IShellView sous-jacente peut dire ce le PIDL est pour le courant sélection. Donc, si je pouvais simplement obtenir Ahold du IShellView, je serais d'or. Malheureusement, je ne vois pas CDM_xxx qui le ferait. Et moi ne peut pas penser du haut de ma tête de tout ce qui pourrait y arriver !!! :(
  2. Une autre idée?

Nous avions l'habitude de compter sur le fait que Windows 9x, 2000, XP et la version de la boîte de dialogue de fichier commun stocké PIDL de chaque élément dans les données de lvItem (crédit original Paul DiLascia):

LPCITEMIDLIST pidlItem = (LPCITEMIDLIST) pListCtrl-> GetItemData (nItem);

Cependant, à partir de contrôles communs de Vista et au-dessus, cette technique échoue: (

Toutes les pensées?

EDIT: Je dois être en mesure d'obtenir ces informations, non seulement pour l'élément sélectionné dans la vue de la liste, mais pour tous les éléments de la vue de la liste

.

EDIT2: La raison pour laquelle je dois creuser si profond:

Dans les versions précédentes de notre application, nous offrons la possibilité de: (1) Appuyez sur une touche personnalisée « Preview » qui ferme la boîte de dialogue, mais les transferts à l'application de la liste des éléments affichés dans la vue, dans leur ordre visible, ainsi que l'indice de celui qui est actuellement mis en évidence. Cette liste doit être entièrement spécifié -. Voir 3 fichiers qui sont tous « J1329192 » (quand il y a vraiment 3 fichiers « J1329192.xyz » « J1329192.xzy » et « J1329192.zyx » [dans cet ordre) n'est pas utile

Les utilisateurs sont autorisés à saisir un filtre de nom de fichier partiel dans le « nom de fichier: » champ et la boîte de dialogue commune affichera uniquement les fichiers qui correspondent au filtre partiel donné, dans le ordre de tri que l'utilisateur a choisi. Donc, faire rapport à l'application exactement ce que l'utilisateur voulait aperçu exige que nous soyons en mesure d'interroger ces informations de la vue de la liste de contrôle (ou la boîte de dialogue commune lui-même).

Nous faisons d'autres améliorations à la boîte de dialogue de fichier ainsi - y compris une forme de vignette, ainsi que une interface personnalisée recent-places, etc. Tout cela a été possible en place volet de visualisation qui affiche la sélection actuelle de l'utilisateur ( avec beaucoup de travail) avant Vista. Après Vista, j'ai courir dans le mur à mur. Pour le moment, nous utilisons une boîte de dialogue de fichier standard avec seulement des caractéristiques très peu de la nôtre, qui ne siège pas bien avec les clients (ce qui est arrivé à la caractéristique X!)

Il y a d'autres améliorations, mais c'est un bon aperçu approximatif. Ils se résument toutes à exiger la connaissance de « vraiment, honnêtement, ce fichier est spécifiquement dans la vue à l'index X? » Et pour des raisons inconnues - Microsoft ne semble pas ressentir le besoin de fournir une telle interface. En fait, ils ne l'ont fait. Que par certains le piratage et l'ingénierie inverse que nous avons pu comprendre comment les choses fonctionnent sous le capot et obtenir les informations nécessaires. Et oui, c'est non pris en charge, et oui, MS inévitablement cassé notre code. Je ne les blâme pas vraiment pour cela - ce que je ne trouve odieux que leur nouvelle interface spiffier est beaucoup plus fermé que leurs plus vieux - et ils ne fournissent pas plus d'interfaces initiaux - interfaces prises en charge - pour faire ces améliorations de dialogue . Son comme ils ont fait un grand pas en arrière deux -. Et en avant aucun (au nom du progrès)

Était-ce utile?

La solution

WM_USER + 7 pour obtenir le navigateur, puis obtenir son interface active IShellView de vue shell.

Vous savez que la conséquence habituelle d'utiliser le droit de comportement en situation irrégulière?

Autres conseils

Ah, je l'ai trouvé. Vous voulez utiliser IFileOpenDialog pour Vista, qui devrait explicilty soutien toutes les opérations que vous avez mentionné.

Je sais que c'est un vieux fil, mais dans Vista +, les dialogues d'ancien style sont toujours pris en charge. Vous pouvez désactiver le style Vista et de conserver tous vos contrôles personnalisés comme avant. C'est ce que nous faisons: nous avons une fenêtre d'aperçu personnalisé dans un modèle accroché dans CFileDialog, qui semble être impossible de reproduire en IFileDialog.

Je crois que vous devez passer FALSE dans un paramètre BOOL dans le constructeur pour désactiver les boîtes de dialogue de style Vista.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top