Newsgroup: it.comp.lang.visual-basic
Titolo: Solo per veri esperti...

Ho un problema che alla Microsoft stanno tentando di risolvermi... nel
frattempo, se qualcuno non ha niente meglio da fare... può dargli
un'occhiata!
Il problema è il seguente:
Devo disabilitare, durante l'esecuzione di una applicazione in VB5,
l'effetto di
animazione che si ha quando una qualsiasi finestra viene ridotta o
massimizzata, per poi riattivarlo quando l'applicazione viene terminata.
Utilizzando il TweakUI si può disabilitare/abilitare tale funzione
(Effects - Window Animation) SENZA RIAVVIARE il sistema (tramite il tasto
APPLICA).
La chiave nel registro di configurazione di Windows 95 cui è associata la
funzione descritta è MinAnimate che si trova in:
HKEY_CURRENT_USER\Control Panel\desktop\WindowMetrics
Quindi per controllare tale funzione è sufficiente impostare a 0
(disabilita animazioni) o 1 (abilita animazioni) il valore MinAnimate.
---------------------------------
La modifica del registro
---------------------------------
Ho realizzato quindi una applicazione in cui viene rilevato il valore
presente in MinAnimate.
Se è uguale a 1 viene settato a 0 (per poi ripristinarlo al termine
dell'esecuzione).
La procedura di modifica del registro che ho realizzato funziona
correttamente, in quanto:
1. monitorando il registro durante l'esecuzione con l'Editor, il valore
MinAnimate cambia come indicato;
2. riavviando il sistema dopo ogni cambiamento del registro, l'effetto sulle
animazioni delle finestre viene prodotto regolarmente.
------------------------------------------------------
IL PROBLEMA!
------------------------------------------------------
Il problema quindi è che l'impostazione della chiave nel registro di
configurazione (che ripeto, avviene correttamente) non è sufficiente a
disabilitare l'effetto di animazione delle finestre (se non con un riavvio
del sistema)
Ho inserito quindi, dopo la modifica della chiave del registro MinAnimate il
SendMessage:
j = SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "windows")
per notificare il cambiamento del registro.
Ho dichiarato la funzione con:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
e dichiarato le costanti:
Public Const WM_SETTINGCHANGE = &H1A
Public Const HWND_BROADCAST = &HFFFF&
Da notare che WM_SETTINGCHANGE sostutuisce WM_WININICHANGE  ma il valore
della costante è lo stesso.
------------------
RISULTATO
------------------
Al momento del SendMessage il programma effettua un refresh del desktop ma
l'animazione delle finestre resta comunque attiva (nonostante la chiave
MinAnimate sia impostata a 0).
(in pratica il SendMessage non "centra" le modifiche che dovrebbe
notificare)
Ho provato ad effettuare alcune variazioni sia sul parametro hwnd che su
msg, ma senza risultati (anzi, cambiando il msg non si aveva più il refresh
dello schermo).
Ho provato anche a sostituire al parametro LParam del SendMessage tutte le
combinazioni di stringhe ottenibili dal path del registro:
    HKEY_CURRENT_USER\Control Panel\desktop\WindowMetrics
    HKEY_CURRENT_USER\Control Panel\desktop
    desktop\WindowMetrics
    WindowMetrics
    MinAnimate
    desktop
    ecc. ecc.
Tutte le stringhe di testo producono il medesimo effetto di refresh che si
ha con la stringa "windows"
Consultando la documentazione a mia disposizione ed alcuni articoli su MSDN
ho notato che i parametri dalla funzione SendMessage sopra riportata
inviano un messaggio relativo all'equivalente della sezione [windows] del
win.ini, ma in Windows 3.x la funzione di animazione che tento di
disabilitare non era presente, quindi è probabile che il messaggio da
notificare sia diverso da quello indicato.
____________
Allora... se siete arrivati fino qui avete avuto sicuramente coraggio!
Se poi potete addirittura aiutarmi...
Guglielmo
gfi...@tin.it

...