PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Sélectionner un fichier dnas l'explorateur Windows
Sélectionner un fichier dnas l'explorateur Windows
Iniciado por jonathan, 04,jun. 2008 10:33 - 9 respuestas
Publicado el 04,junio 2008 - 10:33
Bonjour,

J'ai une table qui contient la liste des fichiers d'un répertoire.
L'objectif est, en faisant un double clic sur le nom d'un fichier, d'ouvrir l'explorateur windows et de sélectionner le fichier.

J'ai fait quelques tests mais sans succès pour l'instant.

Je sais que LanceAppliAssociée(<NomDuRépertoire>) permet d'ouvrir le répertoire dans l'explorateur de Windows.

Mais comment donner l'ordre à Windows de sélectionnner un fichier?

Merci et bon dev.
Publicado el 04,junio 2008 - 11:43
Bonjour,

> Mais comment donner l'ordre à Windows de sélectionnner un fichier?

Utilises les options de la ligne de commande de l'explorateur.

Par exemple :

LanceAppli("Explorer.exe /e, /select,C:\WinDev 12\Programmes\WinDev12.exe")


Regardes sur :

http://support.microsoft.com/kb/152457

pour plus de détails sur les options de l'explorateur.

A+
--
Francis MOREL
Publicado el 04,junio 2008 - 12:11
Jonathan a écrit dans le message de news <d1b04dc2fbc03a353a88a02ade9b433a@news.pcsoft> :
Bonjour,

J'ai une table qui contient la liste des fichiers d'un répertoire.
L'objectif est, en faisant un double clic sur le nom d'un fichier, d'ouvrir l'explorateur windows et de sélectionner le fichier.

J'ai fait quelques tests mais sans succès pour l'instant.

Je sais que LanceAppliAssociée(<NomDuRépertoire>) permet d'ouvrir le répertoire dans l'explorateur de Windows.

Mais comment donner l'ordre à Windows de sélectionnner un fichier?

Merci et bon dev.


Bonjour

Regarde les fonctions sélecteur dans l'aide

bonne journée
Tophe
Publicado el 04,junio 2008 - 12:49
Ok merci pour ton aide

Francis MOREL wrote in news message <9899d58701a656feae220b3f6c967de0@news.pcsoft>:
Bonjour,

Mais comment donner l'ordre à Windows de sélectionnner un fichier?

Utilises les options de la ligne de commande de l'explorateur.

Par exemple :

LanceAppli("Explorer.exe /e, /select,C:\WinDev 12\Programmes\WinDev12.exe")


Regardes sur :

http://support.microsoft.com/kb/152457

pour plus de détails sur les options de l'explorateur.

A+
--
Francis MOREL
Miembro registrado
87 mensajes
Publicado el 26,febrero 2019 - 13:30
Bonjour,

Dans votre exemple, on va donc ouvrir le répertoire "C:\WinDev 12\Programmes\" et sélectionner "WinDev12.exe".
Si l'on exécute 2 fois cette ligne de code, on ouvrira donc 2 Explorateurs Windows.

Connaissez-vous un moyen d'exécuter ce code uniquement si un Explorateur Windows n'est pas déjà ouvert à ce chemin de répertoire?
Peut-on savoir que "Explorer.exe C:\WinDev 12\Programmes" est déjà ouvert?

Cordialement,

Nicolas

--

NR
Miembro registrado
356 mensajes
Publicado el 27,febrero 2019 - 15:06
Bonjour Nicolas,

Malheureusement "Explorer Windows" est une application un peu particulière qui même lancée depuis une application parente ne conserve généralement pas son identification (comme toutes les autres), ni la ligne de commande du lancement.

Il existe cependant une possibilité simple si le paramétrage de l'explorateur a été fait en affichant l'intégralité du chemin dans les titres de la fenêtre.
Avec par exemple un code de ce genre :
SI SysFenHandle("C:\WinDev 23\Programmes")<>0 ALORS
Info("Déjà lancé")
SINON
Info("Pas encore lancé")
FIN

En plus compliqué (si l'explorateur n'a pas été paramétré comme indiqué ci-dessus) on peut en listant les process en exécution par "ExeListeProcessus" par exemple, puis en repérant les instances de l'Explorer et sur chacun parcourir (par API) les fenêtres/champs fils pour chercher une correspondance avec le répertoire à identifier.
Je n'ai pas directement ce code sous la main mais ça ne devrait pas être trop compliqué.
Si tu es intéressé je devrais pouvoir l'écrire au besoin.

A+

--
Francis MOREL
http://www.SoftProtect.fr
Miembro registrado
87 mensajes
Publicado el 27,febrero 2019 - 17:13
Bonjour,

Tout d'abord merci.
En effet, ça n'est pas aussi simple qu'il y parait.

La solution de l'affichage du chemin complet dans le titre de la fenêtre est intéressante mais nous avons trop de clients pour pouvoir être sûr qu'ils conserveront cette configuration.

Je n'ai pas encore trouvé de solutions pour répondre à mon besoin mais le code suivant donne pas mal d'informations sur les processus alors je le met à disposition: cela pourrait intéresser du monde.

J'ai utilisé le code suivant pour remplir un champ table "TABLE_Processus" (contient une seule colonne "COL_MODELE").


//A la déclaration globale de la fenêtre

CONSTANT
user32_dll = "user32.dll"
kernel32_dll = "kernel32.dll"
netapi32_dll = "netapi32.dll"
wsock32_dll = "wsock32.dll"
icmp_dll = "icmp.dll"
iphlpapi_dll = "iphlpapi.dll"
advapi32_dll = "advapi32.dll"
psapi_dll = "psapi.dll"
AvecPid = True
SansPid = NOT AvecPid
SC_MANAGER_CONNECT = 0x0001
SC_MANAGER_CREATE_SERVICE = 0x0002
SC_MANAGER_ENUMERATE_SERVICE = 0x0004
SC_MANAGER_LOCK = 0x0008
SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
GENERIC_READ = 0x80000000
// code de Retour
ERROR_INSUFFICIENT_BUFFER = 0x0000007A
ERROR_INVALID_HANDLE = 0x00000006
ERROR_INVALID_PARAMETER = 0x00000057
ERROR_MORE_DATA = 0x000000EA
// Pour la procedure VideLaCorbeille
SHERB_NOCONFIRMATION = 0x00000001
SHERB_NOPROGRESSUI = 0x00000002
SHERB_NOSOUND = 0x00000004
SHERB_SILENT = 0x00000007
PROCESS_VM_READ = 0x00000010
PROCESS_QUERY_INFORMATION = 0x00000400
PROCESS_READINFO = 0x00000410
FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100
FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
LANG_NEUTRAL = 0x00
SUBLANG_DEFAULT = 0x01
END


//Créer la procédure

Procedure ListeDesProcessus(tab_iexeTypeInformation est un tableau de chaînes)
sResultat est une chaîne
i est un entier
oScript est un objet automation "MSScriptControl.ScriptControl"
sScriptVBS est une chaîne
sParam est une chaîne
sParamAAjouter est une chaîne


POUR i=1 _A_ tab_iexeTypeInformation..Occurrence
SI tab_iexeTypeInformation[i]<>"" ALORS
sParamAAjouter="objProcess."+tab_iexeTypeInformation[i]
// SI i>=2 ALORS
sParamAAjouter+=" & vbTab & "
// FIN
sParam+=sParamAAjouter
FIN
FIN
//sParam +=" & vbNewLine"+RC
sParam +="vbNewLine"+RC

//oScript est un objet Automation "MSScriptControl.ScriptControl"
sScriptVBS=[
Function ListeDesProcessus()
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery( "Select * from Win32_Process Where Name != 'WScript.exe'", , 48)
Dim strReport

For Each objProcess in colProcesses
' skip current script, and display the rest
strReport = strReport & %1
Next

ListeDesProcessus = strReport

End Function
]

sScriptVBS =ChaîneConstruit(sScriptVBS,sParam)

oScript>>Language("VBScript")
oScript>>Reset()
oScript>>AddCode(sScriptVBS)
oScript>>Timeout(-1)

sResultat =oScript>>Run("ListeDesProcessus")

RENVOYER(sResultat)


//Dans un bouton de la fenêtre pour lire les processus en cours

sMesProcessus est une chaîne
sUnProcessus est une chaîne
sUnParametre est une chaîne

tab_sListeParametres est un tableau de chaînes
nIncProcessus est un entier
nIncParametre est un entier
nNbParametres est un entier

sTitreColonne est une chaîne

sNomColonneTri est une chaîne

Sablier(Vrai)
tab_sListeParametres=["ProcessId",...
"Caption",...
"CommandLine",...
"ExecutablePath",...
"ParentProcessId",...
"CreationClassName",...
"CreationDate",...
"CSCreationClassName",...
"CSName",...
"Description",...
"ExecutionState",...
"Handle",...
"HandleCount",...
"InstallDate",...
"KernelModeTime",...
"MaximumWorkingSetSize",...
"MinimumWorkingSetSize",...
"Name",...
"OSCreationClassName",...
"OSName",...
"OtherOperationCount",...
"OtherTransferCount",...
"PageFaults",...
"PageFileUsage",...
"PeakPageFileUsage",...
"PeakVirtualSize",...
"PeakWorkingSetSize",...
"Priority",...
"PrivatePageCount",...
"QuotaNonPagedPoolUsage",...
"QuotaPagedPoolUsage",...
"QuotaPeakNonPagedPoolUsage",...
"QuotaPeakPagedPoolUsage",...
"ReadOperationCount",...
"ReadTransferCount",...
"SessionId",...
"Status",...
"TerminationDate",...
"ThreadCount",...
"UserModeTime",...
"VirtualSize",...
"WindowsVersion",...
"WorkingSetSize",...
"WriteOperationCount",...
"WriteTransferCount"]

//On définit les colonnes du tableau
nIncParametre=0
nNbParametres=tab_sListeParametres..Occurrence
POUR TOUT sUnParametre de tab_sListeParametres
nIncParametre++
sTitreColonne="COL_"+nIncParametre
SI PAS ChampExiste("TABLE_Processus."+sTitreColonne) ALORS
ChampClone(COL_MODELE,sTitreColonne)
{"TABLE_Processus.COL_"+nIncParametre,indChamp}..Visible=Vrai
FIN
sTitreColonne=sUnParametre
{"TABLE_Processus.COL_"+nIncParametre,indChamp}..Libellé =sTitreColonne

SI sUnParametre~="Caption" ALORS
sNomColonneTri="COL_"+nIncParametre
FIN
FIN
TABLE_Processus.COL_MODELE..Visible=Faux


//On liste les processus
sMesProcessus=ListeDesProcessus(tab_sListeParametres)


//On remplit le tableau
TableSupprimeTout(TABLE_Processus)
nIncProcessus=0
nIncParametre=0
POUR TOUTE chaîne sUnProcessus de sMesProcessus SEPAREE PAR RC
SI sUnProcessus<>"" ALORS
nIncProcessus++
nIncParametre=0
TableAjouteLigne(TABLE_Processus)
POUR TOUTE chaîne sUnParametre de sUnProcessus SEPAREE PAR TAB
nIncParametre++
SI nIncParametre<=nNbParametres ALORS
{"TABLE_Processus.COL_"+nIncParametre,indChamp}[nIncProcessus]..Valeur =sUnParametre
FIN
FIN
FIN
FIN

TableAjuste(TABLE_Processus)

SI sNomColonneTri<>"" ALORS
TableTrie(TABLE_Processus,sNomColonneTri)
FIN

Sablier(Faux)



Ce script en VB me permet de retrouver les explorer.exe mais je n'ai que leur PID pour les distinguer mais rien ne permet de retrouver le chemin du répertoire ouvert malheureusement.

Cordialement,

--

NR
Miembro registrado
356 mensajes
Publicado el 28,febrero 2019 - 16:05
Bonjour Nicolas

Ci-joint une procédure (issu de Windev 12) qui permet de lister les fenêtres/champs filles d'une fenêtre principale.
Procedure EnumChilds(hwnd est un entier ,iLParam est un entier = Null)

Lg32 est un entier
Ret32 est un entier
lpstring est une chaîne fixe sur 255
szType est une chaîne ASCIIZ sur 250
cchType est un entier sans signe sur 2 = 250
iLen est un entier sans signe sur 2

Lg32=AppelDLL32("User32", "GetWindowTextLengthA", hwnd)
Ret32=AppelDLL32("User32", "GetWindowTextA", hwnd, &lpstring, Lg32+1)
iLen=AppelDLL32("User32", "RealGetWindowClassA", hwnd, &szType,cchType)

TableAjoute("TABLE_Childs",NumériqueVersChaîne(hwnd)+TAB+szType+TAB+lpstring[[1 À Lg32]])

RENVOYER Vrai
lpstring[[1 À Lg32 contient dans ce cas les titres des champs dont celui que tu cherches sur un des champs.

L'appel se fait par
hwnd est un entier système
lParam est un entier
AppelDLL32("User32", "EnumChildWindows", hwnd, &EnumChilds, lParam)
ou hwnd est le handle de cette fenêtre.

Pour les explications sur chaque API je te laisse regarder sur MSDN :
https://msdn.microsoft.com/fr-fr/

Bon dev.
A+

--
Francis MOREL
http://www.SoftProtect.fr
Mensaje modificado, 28,febrero 2019 - 16:09
Publicado el 12,febrero 2020 - 19:13
Merci
Miembro registrado
324 mensajes
Publicado el 13,febrero 2020 - 09:13
Peut-on savoir que "Explorer.exe C:\WinDev 12\Programmes" est déjà ouvert? <

Si ExeLance("explorer.exe") alors retour ;)

Après y'a surement moyen de récupérer le titre de la fenêtre en utilisant les fonctions de base de windev qui liste les processus (ExeListeProcessus) un truc du genre, et de la on doit pouvoir récupérer le "titre" de la fenêtre de l'explorer sans passer par 24 dll, et déclarations ^^, de mémoire, ca fait longtemps que je ne l'ai pas fais.
Mensaje modificado, 13,febrero 2020 - 09:15