;================================================================================================ ; ; But ; permet de réouvrir ses répertoires de téléchargement, ou plus précisément ; les répertoires pour lesquels on a utilisé la boîte de dialogue "Enregistrer sous...". ; ; Méthode ; Il copie la liste des répertoires contenus dans le registre OpenSaveMRU, affiche le résultat ; dans une boîte de dialogue puis, en cliquant sur un répertoire, d'y accéder via Windows Explorer. ; ; Restriction ; Il ne peut être utilisé que sous Windows XP. ; ; Conseil : ; Pratique sous forme de raccourci bureau ; Inutile pour ceux qui utilisent toujours le même répertoire de téléchargement. ; ;================================================================================================== ;================================== ; ATTENTION : Windows XP uniquement ;================================== #include #include #include #include #include #include #include Local $szDrive, $szDir, $szFName, $szExt Local $sClefs, $sOneClef, $sContent, $sLongName, $sFileName Local $i local $nwidth_max, $nheight_max ;== contenu du registre ============================================================================== ; lit le contenu d'OpenSaveMRU (par ex "dcba") $sClefs = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\*", "MRUList") ; nombre de clefs contenues $nClefs = StringLen($sClefs) if $nClefs = "" Then MsgBox(0,"Derniers répertoires", "vide",2) Exit Endif Local $arr[$nClefs] ; affichage du contenu des clefs For $i = 1 To StringLen($sClefs) ; de la 1ère à la dernière $sOneClef = StringMid($sClefs, $i, 1) $sContent = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\*", $sOneClef) $sLongName = FileGetLongName($sContent) ; on extrait les chemins $sFileName = _PathSplit($sLongName, $szDrive, $szDir, $szFName, $szExt) ; et on les mets dans un array $arr[$i - 1] = $sFileName[1] & $sFileName[2] Next ; enfin, on supprime les valeurs dupliquées de l'array Local $aNewArray = _ArrayUnique($arr);Using Default Parameters ; et on calcule ses dimension en nbre de caractères (en vue d'un affichage correct) $nwidth_max = 0 For $x=1 To UBound($aNewArray) - 1 $n = StringLen($aNewArray[$x]) If $n > $nwidth_max Then $nwidth_max = $n Endif Next $nheight_max = Ubound($aNewArray) ;== menu =============================================================================== ; sélection de répertoire via un menu (double clic dans une Listview, thanks to Melba23) Local $sFolder, $Frm_Main, $Lst_Handle, $Lst_Values local $fDblClk, $SelIndex Opt("GUIOnEventMode", 1) Global $fDblClk = False local $width, $L, $height ; dimensions approximatives du contenu de la listview, en pixels (utiliser _stringsize de melba23 pour un résultat pertinent) $width = $nwidth_max * 8 $height = ($nheight_max * 8) + 100 $Frm_Main = GUICreate("Derniers répertoires mémorisés", $width, $height, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "Close") $Lst_Values = GUICtrlCreateListView("Double clic pour explorer", 15, 15, $width-20, $height-20) $Lst_Handle = GUICtrlGetHandle(-1) ; remplit la listview For $i = 1 To UBound($aNewArray) - 1 _GUICtrlListView_AddItem($Lst_Handle, '"' & $aNewArray[$i] & '"') Next ; ajuste la largeur de la colonne _GUICtrlListView_SetColumnWidth($Lst_Handle, 0, $width-25) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_ListView_DoubleClick") While 1 Sleep(10) If $fDblClk = True Then $SelIndex = _GUICtrlListView_GetSelectedIndices($Lst_Values) $sFolder = _GUICtrlListView_GetItemText($Lst_Handle, $SelIndex) ; lance windows explorer avec le chemin choisi RunWait("explorer /e, " & $sFolder) Exit EndIf WEnd Func Close() Exit EndFunc ;==>Close ; React to double clicks on recent ListView Func WM_ListView_DoubleClick($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tNMHDR = DllStructCreate("int;int;int", $lParam) If @error Then Return If DllStructGetData($tNMHDR, 1) = $Lst_Handle Then If DllStructGetData($tNMHDR, 3) = $NM_DBLCLK Then $fDblClk = True EndIf $tNMHDR = 0 Return $GUI_RUNDEFMSG EndFunc ;==>WM_ListView_DoubleClick