Newsgroup: it.comp.lang.visual-basic
Titolo: Mi serve uno spunto...

...ho fatto in passato qualche piccolo applicativo in vb ed ora, visto che 
non trovo altro metodo ne dovrei fare un'altro.
Questo applicativo dovrebbe venira lanciato all'avvio di windows, restare in 
esecuzione e cambiare l'icona della dir esistenti ma vuote.
Deve fare solo quello, cambiare differenziare le dir vuote dalle altre e, 
nel momento che non sono più vuote ripristinare l'icona originaria.
Seccondo voi è possibile farlo con un applicativo in vb?
Io non ho la più pallida idea sul "da che parte iniziare", se è possibile, 
mi date un indizio?
Grazie 


Per lanciare un programma all'avvio di Windows devi scrivere una
valore nella chiave di registro seguente:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Per cambiare l'icona alle cartelle...
Ogni cartella con qualcosa di non-standard contiene al suo interno un
file nascosto chiamato Desktop.ini
Esempio di un Desktop.ini di una cartella vuota con una stella come
icona:
[.ShellClassInfo]
IconResource=C:\Windows\system32\SHELL32.dll,43
Gestendo questo file da codice puoi fare quello che vuoi.
Il problema sarebbe fare il refresh della visualizzazione di explorer,
perchè quando modifichi il file desktop.ini la cartella continua ad
assumere il vecchio aspetto finchè non viene riavviato il processo
explorer.exe. Dato che riavviare explorer.exe è una porcheria, ti
lascio a chi è piu esperto di me.
ciao!

 ha scritto nel messaggio 
news:e92adca8-ec8e-48e8-b602-
<Per lanciare un programma all'avvio di Windows devi scrivere una
<valore nella chiave di registro seguente:
<HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
<
<Per cambiare l'icona alle cartelle...
<Ogni cartella con qualcosa di non-standard contiene al suo interno un
<file nascosto chiamato Desktop.ini
Intanto, grazie per lo spunto!
Forse ho intuito dove può essere la soluzione ma non ho la minima idea di 
come arrivarci. :-(
Mi spiego. Ok, lavoro via codice sul file Desktop.ini ma per l'applicazione 
delle istruzioni in quel file come faccio?
ho notato che se vado col tasto dx sopra una cartella, vado a cambiargli 
l'icona, al termine dell'operazione se clicco su "applica" lui CAMBIA 
L'ICONA! Ecco... il punto è sapere quale routine si scatena schiacciando su 
quell'APPLICA se riuscissi e se potessi intercettarlo sarei a buon punto...
...di nuovo... mi rimetto alle vostre conoscenze... 

 ha scritto nel messaggio 
news:e92adca8-ec8e-48e8-b602-
<Per cambiare l'icona alle cartelle...
<Ogni cartella con qualcosa di non-standard contiene al suo interno un
<file nascosto chiamato Desktop.ini
Mi basterebbe sapere come poter lanciare la funzione "aggiorna" (desktop - 
tasto destro sulla cartella) via codice... 

 ha scritto nel messaggio

appunto... è proprio il problema di capire cosa fa il sistema
operativo quando schiacci APPLICA.
Sicuramente c'è una chiamata API, ma non ho idea di quale sia...
prova con una ricerca su google "vb6 refresh windows explorer"
ciao!

 ha scritto nel messaggio 
news:dabf1212-89aa-42ba...@a1g2000hsb.googlegroups.com...
<appunto... è proprio il problema di capire cosa fa il sistema
<operativo quando schiacci APPLICA.
<Sicuramente c'è una chiamata API, ma non ho idea di quale sia...
<prova con una ricerca su google "vb6 refresh windows explorer"
<
<ciao!
Da quello che ho capito, googleggiando, basterebbe simulare la pressione del 
tasto f5 (lo so non è molto pulito ma dovrebbe funzionare) soltanto che non 
sono riuscito a capire che "codice" usare se volessi associare questa cosa 
al click di un button. 

 al click di un button.
Questo funziona? (non ho vb6 quindi non posso provarlo...)
Private Const HWND_BROADCAST = &HFFFF
Private Const SMTO_ABORTIFHUNG = &H2
Private Const WM_SETTINGCHANGE = &H1A
Private Declare Function SendMessage Lib "user32" Alias
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam
As Long, lParam As Any) As Long
Private Sub RefreshExplorer()
SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
'SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0,
"Environment", SMTO_ABORTIFHUNG, 5000, 0
End Sub
Private Sub Command1_Click()
RefreshExplorer
End Sub
ciao!

 ha scritto nel messaggio 
news:33667d9c-0360-4607-b2d7-
<Questo funziona? (non ho vb6 quindi non posso provarlo...)
<
<Private Const HWND_BROADCAST = &HFFFF
<Private Const SMTO_ABORTIFHUNG = &H2
<Private Const WM_SETTINGCHANGE = &H1A
<Private Declare Function SendMessage Lib "user32" Alias
<"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam
<As Long, lParam As Any) As Long
<Private Sub RefreshExplorer()
<SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
<'SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0,
<"Environment", SMTO_ABORTIFHUNG, 5000, 0
<End Sub
<Private Sub Command1_Click()
<RefreshExplorer
<End Sub
Innanzi tutto grazie per l'aiuto.
E no, non funziona. :-(
Ma non so se ho copiato bene il codice, mi spiego, in questa parte:
Private Sub RefreshExplorer()
SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
'SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, 0,
"Environment", SMTO_ABORTIFHUNG, 5000, 0
End Sub
Nella 3a riga 'SendMessageTimeout  ha un apostrofo davanti, è una riga 
commentata quindi inutile?
Nella riga seguente invece c'è un "Environment", SMTO_ABORTIFHUNG, 5000, 0 è 
il proseguo della riga precedente o dovrebbe essere una nuova riga?

puoi provare anche a intercettare il controllo in questo modo:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal 
lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" 
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal 
lpsz2 As String) As Long
Private Declare Function UpdateWindow Lib "user32" (ByVal hWnd As Long) As 
Long
Private Sub Command1_Click()
    Dim hWnd(2) As Long
    hWnd(0) = FindWindow("Progman", "Program Manager")
    If hWnd(0) <> 0 Then
        hWnd(1) = FindWindowEx(hWnd(0), 0&, "SHELLDLL_DefView", 
vbNullString)
        If hWnd(1) <> 0 Then
            hWnd(2) = FindWindowEx(hWnd(1), 0&, "SysListView32", 
vbNullString)
            If hWnd(2) <> 0 Then UpdateWindow hWnd(2)
        End If
    End If
End Sub
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 ha scritto nel messaggio

E' così (togliendo i commenti):
Private Sub RefreshExplorer()
SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End Sub
Se non funziona non mi stupirei, qualche anno fa mi serviva una cosa
del genere e non sono riuscito a trovarla.
Ho anche letto accenni a workarounds... ad esempio creare e cancellare
un file in modo che windows faccia il refresh... ma non mi sembra
proprio una buona soluzione e non funziona sempre.
Dato che ci sei, prova anche così:
Private Declare Function SendNotifyMessage Lib _
    "user32" Alias "SendNotifyMessageA" _
    (ByVal hwnd As Long, _
    ByVal msg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const WM_SETTINGCHANGE = &H1A
Private Const HWND_BROADCAST = &HFFFF&
e in un command metti:
dim Ret as long
Ret = SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)

 ha scritto nel messaggio 
news:29f70e07-8bb3-4775-859f-
<E' così (togliendo i commenti):
<
<Private Sub RefreshExplorer()
<SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
<End Sub
No, non va...
<Dato che ci sei, prova anche così:
<
<Private Declare Function SendNotifyMessage Lib _
<   "user32" Alias "SendNotifyMessageA" _
<   (ByVal hwnd As Long, _
<  ByVal msg As Long, _
< ByVal wParam As Long, _
<   ByVal lParam As Long) As Long
<
<Private Const WM_SETTINGCHANGE = &H1A
<Private Const HWND_BROADCAST = &HFFFF&
<
<e in un command metti:
<
<dim Ret as long
<Ret = SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)
Questo codice, a differenza dell'altro, fa qualcosa... nel senso che 
"sembra" refreshare ma in realtà non lo fa. 

 ha scritto nel messaggio 
news:4909c1fa$0$11367$5fc...@news.tiscali.it...

Niente da fare... ma grazie lo stesso. 


Questo dovrebbe funzionare:
Private Declare Sub SHChangeNotify Lib "Shell32" _
    (ByVal wEventId As Long, ByVal uFlags As Long, _
    ByVal dwItem1 As Long, ByVal dwItem2 As Long)
Private Const SHCNE_ATTRIBUTES As Long = &H800&
Private Const SHCNF_PATH = &H5&
Private Const SHCNF_FLUSH = &H1000&
Public Sub RefreshFolder(ByVal Path As String)
    Call SHChangeNotify(SHCNE_ATTRIBUTES, SHCNF_PATH Or SHCNF_FLUSH, 
StrPtr(Path), 0)
End Sub
A questo punto chiama RefreshFolder passandole il path della folder parent 
della folder di cui modifichi l'icona.
Bye
Raf 

"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio 
news:gecj7q$vm9$1...@alix.livenet.it...

Grande!
Funziona proprio come dovrebbe!
Grazie. 

Secondo me qui trovi più di un valido aiuto...
http://tinyurl.com/6aukrw
