Newsgroup: it.comp.programmare.win32
Titolo: Spegnere monitor oppure...?

Dalle ricerche fatte su google ho trovato per spegnere (o mettere in
stand-by) il monitor solo soluzioni che gravitano intorno ai messaggi del
tipo: WM_SYSCOMMAND / SC_MONITORPOWER / SC_SCREENSAVE.
Questa soluzione funziona bene su Window98/me ma non funziona su Xp, non
sempre quanto meno, forse perche' influenzata dalle impostazioni locali di
screensaver e risparmio engergetico.
A me per inciso, su windowsXp Pro, non ha mai funzionato.
Mi interesserebbe sapere da qualcuno a cui funziona che impostazioni ha per
screensaver e risparmio energetico, perche' caso mai potrei pensare di
impostarle temporaneamente via registro e poi ripristinarle all'uscita del
programma.
Vorrei pero' entrare in dettaglio sul motivo per cui vorrei spegnere il
monitor, perche' magari esiste qualche escamotage che ottiene lo stesso
scopo.
Ho realizzato un programma che funziona in background e interagisce con un
gioco: tomb raider 4 o piu' esattamente il programma level editor di tomb
raider che comunque usa la stessa engine di tr4
Il mio programma talvolta simula la pressione di tasti in modo da attivare
alcune funzioni di tr4.
Di per se tutto funziona, solo che alla pressione (simulata) di questi
tasti, tr4 reagisce (come e' ovvio) mostrando alcune schermate intermedie.
Quello che vorrei e' per l'appunto oscurare il video per quei pochi secondi
in cui compaiono questi menu', in modo che l'utente non veda queste fasi
intermedie.
Il sistema di spegnere il monitor va bene con win98 ma non con xp, allora
sto cercando qualche altra possibilita'.
Di seguito alcuni tentativi (falliti):
- Selezionare una nuova palette logica con tutti i colori impostati a nero
Risultato: tr4 se ne impippa, forse perche' le directx non usano palette
logiche.
Mi chiedo pero' se non ci sia il modo, magari proprio con le directx di
cambiare la palette dei colori effettivamente usata.
- Nascondere il programma con una finestra.
Risultato: tr4 non appena scopre di non essere in primo piano entra in una
sorta di stand-by. Il programma principale sospende il thread che
rappresenta il motore di gioco vero e proprio
- Spostare la finestra del programma in modo che rimanga in primo piano ma
fuori dall'area visibile dello schermo.
Risultato: neanche provato in realta', perche il programma lavora in modo
massimizzato a tutto schermo e non vedo come si possa spostare.
Ho provato anche a coprire il suo DC usando bitblt() ma e' una guerra persa
in partenza. Tr4 ha dei refresh continui e molto rapidi della schermata di
gioco.
Fra l'altro c'e' anche un'altra complicazione che non ho ben compreso.
Il gioco spesso usa una risoluzione diversa da quella del desktop di windows
tanto che pensavo fosse proprio un altro desktop, ma facendo l'enum dei
desktop ne risulta solo 1.
Forse la diversa risoluzione e' ottenuta solo le directx, boh, il fatto e'
che non conosco bene le directx.
Come altre soluzioni mi chiedevo se non si potesse sospendere il refresh
dell'immagine senza pero' sospendere il thread.
Mi basterebbe un oscuramento di circa 2 secondi.
ciao
Paolo B.

dico per dire..
visto che se copri tr4 con un'altra finestra va in stand-by potresti 
provare ad usare una finestra topmost che anche se non ha il focus 
rimane in primo piano (e non dovrebbe blocchare tr4)
cosa stai facendo una cheat-app? :)
PS per quanto riguarda le dx se nn sbaglio il cambio di risoluzione 
avviene al volo, nel momento che esci dalla applicazione dx la 
risoluzione torna ad essere quella di windows
ciao


Questo l'ho notato anche io e mi crea un sacco di problemi perche' la
finestra di tomb tende a perdere la massimizzazione una volta riattivata e
il processo (o forse il sotto-processo) di tomb non riesce piu' a ottenere
l'input della tastiera. :-/
ciao
Paolo