7
votes

C #: Comment utiliser ShopenNfolderSelectems

Quelqu'un pourrait-il donner un exemple sur la manière d'utiliser la fonction shell ShopEnfolderandSelectStems de C #? Je ne comprends pas vraiment comment utiliser ce genre de fonctions et je n'ai pas pu le trouver sur pinvoke.net . .. = /

dire que j'ai trois fichiers appelés

  • x: \ images \ a.jpg
  • x: \ images \ s.jpg
  • x: \ images \ d.jpg

    Je veux ensuite ouvrir le dossier x: \ images avec a.jpg , s.jpg et d. jpg sélectionné.


0 commentaires

4 Réponses :


-1
votes

La plupart des besoins des besoins de shopoenfolderselectedems serait géré par:

Pour la sélection de fichier en C #, vous utiliseriez normalement: System.Windows.Forms.openFileDialog .

Pour la sélection de dossiers en C #, vous utiliseriez normalement: System.Windows.Forms.folderBrowserDialog .

Vous définiriez un filtre approprié et vous pouvez définir un élément sélectionné initialement.

Peut-être que c'est assez proche de ce dont vous avez besoin?


1 commentaires

Non, ceux que je connais. Ils sont destinés à sélectionner des dossiers ou des fichiers à ouvrir dans votre application. Ce que je veux, c'est ouvrir des fenêtres exploratrices de mon application avec des fichiers sélectionnés. Comme vous pouvez faire par exemple Windows Media Player dans lequel vous pouvez marquer un certain nombre de fichiers, cliquez avec le bouton droit de la souris et cliquez sur "Afficher dans Explorer" ou de ce qu'il est dit. Lorsque vous faites cela, une fenêtre d'explorateur s'ouvrira avec tous les fichiers sélectionnés que vous avez sélectionnés dans WMP.



1
votes

vérifier http://www.cnblogs.com/ qiuyi21 / archive / 2009/06/24 / 1510592.html . L'exemple utilise IshellLink pour obtenir des PIDL du chemin avant de lancer ShopenfolderDselectItems, j'utiliserais iLcreatefrompath à la place.


1 commentaires

Hm, je ne lis pas chineese, hehe. Quoi qu'il en soit, pourriez-vous créer un exemple simple d'utiliser ILCreatefrompath et ShopenfolderSelectItems pour sélectionner les 3 fichiers que j'ai mentionnés dans ma question?



14
votes

Comme vous semblez avoir demandé deux fois la même question (l'autre étant C #: Comment ouvrir les fenêtres de l'Explorateur Windows avec un certain nombre de fichiers sélectionnés qui n'avait pas de réponse) Je posterai ma solution aux deux questions que je ne sais pas si je devrais faire un wiki communautaire.

Recherche d'une réponse après qu'un collègue ait eu le problème que je n'avais trouvé aucun donc j'ai écrit une petite classe pour le faire. Le code est sur GIST et je collerai la version actuelle à la fin de cet article.

Avec vos fichiers échantillons, la syntaxe sera la suivante: xxx

Il existe certaines limitations à mon code par rapport à l'API de faible niveau, principalement:

  • La sélection du bureau n'est pas implémentée
  • Le répertoire parent doit être un répertoire ou un lecteur. Vous ne pouvez donc pas sélectionner plusieurs lecteurs dans le dossier de mon ordinateur, par exemple.

    Quoi qu'il en soit, voici le code source de la classe showselectedonxplorer: xxx


3 commentaires

Cela ressemble à la solution à un problème de mien aussi. Pourriez-vous expliquer comment j'utilise réellement ce code? J'imagine que ce n'est pas quelque chose que je peux simplement mettre un fichier .bat ou .vbs ... merci.


Comme la balise C # implique que c'est une classe C # et il est nécessaire d'être construit à l'aide d'un compilateur C # et appelé à partir d'un programme ou d'une bibliothèque C #.


Il analyse correctement toutes les fenêtres ouvertes et, si la choisi est déjà ouverte, elle n'essaie que de se concentrer. Très bien; Merci beaucoup pour la part.



5
votes

pas une réponse à 100%, mais cet extrait montre comment sélectionner un seul élément dans l'explorateur de C #.

    private void SelectInFileExplorer(string fullPath)
    {
        if (string.IsNullOrEmpty(fullPath))
            throw new ArgumentNullException("fullPath");

        fullPath = Path.GetFullPath(fullPath);

        IntPtr pidlList = NativeMethods.ILCreateFromPathW(fullPath);
        if (pidlList != IntPtr.Zero)
            try
            {
                // Open parent folder and select item
                Marshal.ThrowExceptionForHR(NativeMethods.SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));
            }
            finally
            {
                NativeMethods.ILFree(pidlList);
            }
    }

    static class NativeMethods
    {

        [DllImport("shell32.dll", ExactSpelling=true)]
        public static extern void ILFree(IntPtr pidlList);

        [DllImport("shell32.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
        public static extern IntPtr ILCreateFromPathW(string pszPath);

        [DllImport("shell32.dll", ExactSpelling=true)]
        public static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);
    }


2 commentaires

Merci, mais celui-ci je me suis trompé seul;)


merci, travaillé pour moi pour la navigation de fichiers dans le réseau