Newsgroup: it.comp.lang.visual-basic
Titolo: Questa volta posto io una soluzione

Salve!!!
Finalmente dopo taaaaaanto tempo sono riuscito (e google ha buona parte del
merito) a fare una cosa che da tempo mi faceva sbattere la capa a casa al
pc!
Allora.... tempo fa volevo spegnere il monitor da VB, mandarlo in shutdown,
poweroff, insomma fare qualcosa del genere.
A partire da MSDN fino a tutti i gruppi trovavo sempre e solo:
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, 1
oppure
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, 2
oppure (ve li elenco tutti >:| )
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, -1
o magari Me.hWnd al posto di GetDesktopWindow.
Eppure prova e riprova... niente!!! 'Sto monitor era cosa che non si
spegneva...
Ora provando un pezzettone di codice trovato su un sito tedezko ho visto che
l'inghippo stava sull'ultimo parametro: bisogna passarlo come byVal!!!!!
Per chi avesse ancora intenzione/voglia di spegnere il monitor da vb, ecco
la chiamata corretta:
    'Per spegnere il monitor
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, byVal 2&
    'Per farlo andare in risparmio energetico
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, byVal 1&
    'Per farlo risvegliare
    SendMessage GetDesktopWindow, WM_SYSCOMMAND, SC_MONITORPOWER, byVal -1&
et voilà!!!

 l'inghippo stava sull'ultimo parametro: bisogna passarlo come byVal!!!!!
In effetti la SendMessage č (insieme alla rtlMoveMemory) una delle 
funzioni polimorfe piů rognose, perň, non per svilirti, ma č "quasi" 
ovvio che un valore debba essere passato ByVal :)
Ciao

 ovvio che un valore debba essere passato ByVal :)
Sarà anche *ovvio* ma in altre chiamate alle API non c'è bisogno di 
usare byVal per passare un valore perchè la funzione è già dichiarata 
con byVal. QUindi quando faccio le chiamate passo direttamente i valori 
che voglio e tutto funziona.
In questo caso invece c'è un lParam as Any che non è dichiarato come 
byVal (probabilmente perchè in altri casi deve essere un byref, che ne 
so...)
E comunque su tutti gli esempi che ho beccato non c'era nessun byVal 
quindi prova e riprova non andava niente....
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque. (Micheal Corleone)

 so...)
è sempre così: una cosa è facile se sai farla :-)
per la poca esperienza che ho in merito all'api, i parametri, generalmente,
devono essere passati per valore, a meno che la funzione stessa non li
utilizzi per restituire un valore.
nel caso della sendmessage, poi, il parametro è dichiarato come "any",
perchè probabilmente, in funzione del messaggio che si manda, bisogna
inviare un tipo diverso.
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 inviare un tipo diverso.
Puoi togliere il probabilmente. Sarà una stupidaggine, non lo so,
ma io ho una serie di dichiarazioni per la SendMessage:
SendMessageLong, SendMessageByte, SendMessageDouble...
e pure una SendMessageRef per un caso in cui Wparam viene
passato byRef.
Bye, G.

 file :)
Backup incrementali no, eh ? :-P
"Ogni volta" ? Ma ogni quanto formatti ? Io ho avuto un 200 Mhz
dal '97 all'anno scorso, quando è morta la M/B, e non l'ho mai
riformattato, solo pulito e aggiornato.
Bye, G.

 Bye, G.
-- 
Nella vita una sola cosa č certa: se la storia ci ha insegnato qualcosa, 
č che si puň uccidere chiunque. (Micheal Corleone)