Page 1 sur 1

Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 11:58
par eric
Bonjour,

Lorsque l'on utilise la fonction FileSelectFolder sur un dossier spécial de Windows (Mes Documents, Mes images...), la fonction FileSelectFolder ne retourne pas un chemin d'accès classique, mais quelque chose comme :

::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms

Existe t il une fonction qui me permettrait de récupérer le chemin d'accès de type C:\Users\user\Documents ?

Merci

Eric

Re: Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 15:34
par DimVar
Bonjour,

Tu peux t'inspirer des Macros deja présentes dans le langage.
@AppDataDir Path to current user's Roaming Application Data
@LocalAppDataDir Path to current user's Local Application Data
@DesktopDir Path to current user's Desktop
@MyDocumentsDir Path to My Documents target
@FavoritesDir Path to current user's Favorites
@ProgramsDir Path to current user's Programs (folder on Start Menu)
@StartMenuDir Path to current user's Start Menu
@StartupDir current user's Startup folder
@UserProfileDir Path to current user's Profile folder.



Cdlt, Dimvar.

Re: Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 16:58
par eric
Bonjour Dimvar,

Oui, mais comment obtenir le chemin d'accès réel à partir de ce que me retourne Fileselectfolder.

L'idée, c'est qu'au lieu d'avoir ::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms je puisse obtenir un chemin du type C:\Users\user\Document pour pouvoir noter ce chemin dans un fichier ou dans une listview par exemple.

Je ne sais pas à l'avance si l'utilisateur va choisir Documents ou Images ou autre chose.

Merci

Eric

Re: Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 17:25
par DimVar
En effet, j'ai du répondre un peu rapidement.
C'est un pb de CLSID lié à ta version de Windows. Je t'invite à te rapprocher de la doc où ils précisent ce point.
Un fil anglais sur le sujet abordé :
https://www.autoitscript.com/forum/topi ... ectfolder/

Re: Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 17:49
par eric
Ah ouais, visiblement cela semble plus compliqué que ce que j'avais imaginé.

Re: Convertir un dossier spécial en chemin d'accès

Posté : lun. 14 janv. 2019 22:45
par Tlem
Bonsoir.

Sinon, voici une petite fonction spéciale pour vous. ^^

Code : Tout sélectionner

#include <WinAPIShellEx.au3>

ConsoleWrite(GetRealPath("::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms") & @CRLF)
ConsoleWrite(GetRealPath("D:\Users\User\Desktop\Documents.library-ms") & @CRLF)

Func GetRealPath($sPath)
	Local $aPath = StringRegExp($sPath, "({.*})(.*)", 1)
	; Si le chemin n'est pas composé d'un chemin spécial, on retourne le chemin initiale.
	If @Error Then Return $sPath

	; Sinon on retourne le chemin converti
	Return _WinAPI_ShellGetSpecialFolderPath($aPath[0]) &  $aPath[1]
EndFunc

Re: Convertir un dossier spécial en chemin d'accès

Posté : mar. 22 janv. 2019 10:10
par eric
Bonjour,

Merci Thierry,

Je vais tester ce code.

Cordialement

Eric

Re: Convertir un dossier spécial en chemin d'accès

Posté : mar. 22 janv. 2019 15:10
par eric
Je dois mal me servir de la commande _WinAPI_ShellGetSpecialFolderPath parce que, quel que soit le CLSID que je mets, j'obtiens toujours le chemin vers le bureau.

J'ai testé depuis la liste des CLSID de cette page :

https://www.autoitscript.fr/autoit3/doc ... /clsid.htm

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{21EC2020-3AEA-1069-A2DD-08002b30309d}") ;(normalement Control Panel)
MsgBox(4096,"",$dossier)
Me retourne sur mon PC : C:\Users\user\Desktop

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}") ;(normalement Programs Folder)
MsgBox(4096,"",$dossier)
Me retourne aussi sur mon PC : C:\Users\user\Desktop

C'est bizarre !

Re: Convertir un dossier spécial en chemin d'accès

Posté : mar. 22 janv. 2019 20:32
par Tlem
Bonsoir.
Effectivement, il semble que je soit aller un peut vite en besogne ... :oops:

La valeur d'entrée de la fonction _WinAPI_ShellGetSpecialFolderPath() doit être un CSIDL !!!
Après quelques recherches, je suis tombé sur ça : https://docs.microsoft.com/en-us/window ... wnfolderid


Lorsque j'ai vu l'exemple de la fonction, j'ai cru que les variables $CSIDL_WINDOWS, $CSIDL_SYSTEM, $CSIDL_FONTS correspondaient à des CLSID (GUID), mais visiblement ce n'est pas le cas car dans le fichier APIShellExConstants.au3 les valeurs sont tel que ceci :
Global Const $CSIDL_APPDATA = 0x001A
Global Const $CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019
Global Const $CSIDL_RECENT = 0x0008
Global Const $CSIDL_SENDTO = 0x0009


Je n'ai malheureusement pas trouvé comment faire le lien entre le CLSID (GUID) et le CSIDL.

Désolé pour la fausse joie. :oops:

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 11:58
par walkson
Bonjours
Ce n'est pas cette fonction _WinAPI_ShellGetKnownFolderPath() qu'il faut ?
si je me réfère aux variables comme
Global Const $FOLDERID_Cookies = '{2B0F765D-C0E9-4171-908E-08A611B84FF6}'
Global Const $FOLDERID_Desktop = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}'
Global Const $FOLDERID_DeviceMetadataStore = '{5CE4A5E9-E4EB-479D-B89F-130C02886155}'
Global Const $FOLDERID_DocumentsLibrary = '{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}'
Global Const $FOLDERID_Downloads = '{374DE290-123F-4565-9164-39C4925E467B}'
Global Const $FOLDERID_Favorites = '{1777F761-68AD-4D8A-87BD-30B759FA33DD}'
Global Const $FOLDERID_Fonts = '{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}' etc....
dans APIShellExConstants.au3

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 15:26
par eric
Bonjour Walkson,

Merci pour l'idée mais _WinAPI_ShellGetKnownFolderPath ne semble pas accepter de CLSID comme paramètre. Si j'essaie cela retourne une chaîne vide et @error <> 0

Mince, moi qui pensais que cela n'allait être qu'une formalité, je ne m'imaginais pas que cela pourrait-être aussi complexe.

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 16:19
par eric
A tout hasard, je vais essayer de poser la question sur le forum anglais.

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 16:37
par walkson
essayez

Code : Tout sélectionner

#include <WinAPIShellEx.au3>

;>> en se basant sur les variables de APIShellExConstants.au3 ex: Global Const $FOLDERID_AddNewPrograms = '{DE61D971-5EBC-4F02-A3A9-6C82895E5C04}'

MsgBox(0, '1',_WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicLibraries))
MsgBox(0, '2',_WinAPI_ShellGetKnownFolderPath('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}'))
MsgBox(0, '3',_WinAPI_ShellGetKnownFolderPath('{AE50C081-EBD2-438A-8655-8A092E34987A}'))
MsgBox(0, '4',_WinAPI_ShellGetKnownFolderPath('{352481E8-33BE-4251-BA85-6007CAEDCF9D}'))
MsgBox(0, '5',_WinAPI_ShellGetKnownFolderPath($FOLDERID_SendTo))
ou

Code : Tout sélectionner

#include <WinAPIShellEx.au3>

MsgBox(0, '1',_WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicLibraries))
MsgBox(0, '2',_WinAPI_ShellGetKnownFolderPath($FOLDERID_CommonStartup))
MsgBox(0, '3',_WinAPI_ShellGetKnownFolderPath($FOLDERID_CommonTemplates))
MsgBox(0, '4',_WinAPI_ShellGetKnownFolderPath($FOLDERID_Libraries))
MsgBox(0, '5',_WinAPI_ShellGetKnownFolderPath($FOLDERID_SendTo))

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 16:49
par eric
Alors, effectivement cela fonctionne avec vos valeurs, mais dès que je mets les miennes pour Documents par exemple, cela ne fonctionne pas et le résultat est vide.

Pourquoi ? :?

Re: Convertir un dossier spécial en chemin d'accès

Posté : mer. 23 janv. 2019 18:16
par walkson
Aucune idée !
mais même avec la liste CLSID, on obtient d'étranges résultats
FileSelectFolder("Choose a folder.", "::{D20EA4E1-3957-11d2-A40B-0C5020524152}", 1);Fonts (Polices de caractère)
Cela ouvre la fenêtre image à la place de Fonts (Quand Windows ne trouve pas, il ouvre les images :P )
Avec _WinAPI_ShellGetKnownFolderPath(), il faudra utiliser les constants dans APIShellExConstants.au3 ($FOLDERID_* et compagnie) mais des fois, il n'y a pas de retour, faudra tester aussi...

Re: Convertir un dossier spécial en chemin d'accès

Posté : ven. 25 janv. 2019 18:43
par eric
Bon, j'ai tenté le coup sur le forum anglais, mais c'est toujours aussi complexe.

https://www.autoitscript.com/forum/topi ... to-a-path/

Je vais laisser tomber, s'il faut un code complexe, juste pour ça, cela ne vaut pas trop le coup.
Surtout que sur Windows 10 les bibliothèques sont désactivées par défaut. Comme ça, personne n'ira cliquer dessus. :D

Merci en tout cas de vous êtes penché sur mon problème.

Re: Convertir un dossier spécial en chemin d'accès

Posté : ven. 25 janv. 2019 21:23
par walkson
Bonjour,
Complexe ? non.
Essayez cela

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_Libraries)
MsgBox(0, '',$libraries)
FileSelectFolder("Choose a folder.", $libraries & "\Documents C.library-ms", 1) ; ou $FOLDERID_DocumentsLibrary avec _WinAPI_ShellGetKnownFolderPath()
FileSelectFolder("Choose a folder.", $libraries & "\Music.library-ms", 1) ; ou $FOLDERID_MusicLibrary avec _WinAPI_ShellGetKnownFolderPath() etc...
ShellExecute($libraries & "\Pictures.library-ms") ; ou $FOLDERID_PicturesLibrary
Sleep(1000)
ShellExecute($libraries & "\Videos.library-ms") ;ou $FOLDERID_VideosLibrary
Sleep(1000)
ShellExecute($libraries & "\Documents C.library-ms\Classeur1.xlsx") ; si "MesDocuments" possède Classeur1.xlsx
$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicVideos)
ConsoleWrite($libraries & @CRLF) ;C:\Users\Public\Videos
ShellExecute($libraries & "\Sample Videos\Wildlife.wmv"); fonctionne sur Win7 RMQ: Faune.wmv est nommé en réalité Wildlife.wmv sur la french version
;ou
;$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_SampleVideos)
;ConsoleWrite($libraries & @CRLF) ;C:\Users\Public\Videos\Sample Videos
;ShellExecute($libraries & "\Wildlife.wmv")
#cs
ShellExecute("C:\Program Files\AutoIt3\Include\APIShellExConstants.au3")
;tous les chemins possibles
;ligne 604 à 705
#ce
Je découvre avec vous cette fonction que je trouve très intéressante car elle permet de joindre des dossiers peu habituels.
Le monde des "Winapi" est un monde obscure et mal documenté que je l'utilise de plus en plus car les résultats sont très appréciables.