Vai al contenuto
PLC Forum


Visual Basic - ritorno dalla modalità schermo spento


Stefano Sormanni

Messaggi consigliati

Stefano Sormanni

Su una applicazione SCADA il mio cliente vuole lo spengimento dello schermo, vuole però che quando si presenta un allarme, lo schermo ritorni in attività.

Esiste un comando in VB che mi faccia questo ripristino ?

Grazie

Link al commento
Condividi su altri siti


Puoi usare la funzione Hide per nascondere il form o i forms quando fai lo spegnimento. Se non è presente nesun form o altro programma hai lo schermo nero. Poi quando si ativa un allarme ripristini la finestra con la funzione Show. L'idea è solo abozzata perchè bisogna considerare le varie implicazioni dovute ai programmi in esecuzione.

Link al commento
Condividi su altri siti

Interessante. Però Livio, mi pare che Stefano parli di spegnimento dello schermo (come quando si attiva lo screen saver). Quindi quale evento di VB potrebbe riattivare lo schermo? Provare a simulare la pressione dei tasti?

ovvero nella routine di comparsa degli allarmi inserire un SendKeys: invia alla finestra attiva una o più sequenze di tasti, come se queste fossero state immesse tramite tastiera. Mi voglio togliere la curiosità, provo subito con un timer.

Modificato: da Hellis
Link al commento
Condividi su altri siti

Visto che fai la prova, prova anche se si riesce a simulare il movimento del mouse. La mia era un'ipotesi di lavoro, ma è molto bello quando c'è questo tipo di partecipazione: se ne esce tutti con qualche conoscienza in più.

Link al commento
Condividi su altri siti

Allora io ho creato una form con un controllo Timer impostato a 65 secondi, e ho attivato lo screen saver.

NElla form mandata in esezuione ho scritto questo codice di prova

Private Sub Timer1_Timer()

Beep

SendKeys "{Home}+{End}"

End Sub

dove il beep mi serve per capire quando si attiva l'evento: lo screen saver lo disattiva, ma con lo schermo spento non ho ottenuto questo risultato. Non so se se è una questione di tasti, o se è meglio provare con l'evento AppActivate. Riprovo

Link al commento
Condividi su altri siti

Stefano Sormanni

Io ho lo SCADA che è sempre in funzione, ma il cliente vuole lo spegnimento dello schermo dopo 3 min. il quale se ad esempio muovi il mouse riappare. All'interno del mio mimico ho una routine VBA di tipo timer che non appena 'vede' un allarme mi esegue la routine, che potrebbe essere muovi il mouse oppure direttamente elimina il black screen. La funzione screen ha questa potenzialità ?

Link al commento
Condividi su altri siti

No, con il comando sendkeys riesco a disattivare lo screen saver, ma non si riaccende lo schermo. Stasera faccio un pò di prove, figlie permettendo. Scusatemi ma sono un autodidatta del vb e ho bisogno di sbatterci un pò la crapa ;)

Secondo me bisogna appoggiarsi a qualche API di Windows.

Modificato: da Hellis
Link al commento
Condividi su altri siti

Se ho tempo prova anch'io con qualche prova. In effetti il problema sarebbe semplice: si setta lo screen saver a 3'

e con un tasto o con il movimento del mouse riappare. Questo è WIN. La via più giusta è ricercare l'API che, riconosciuto il movimento del mouse od il tasto, fa uscire dal modo screen saver. Ora comincio a consultare la bibbia delle API, se scopro qualche cosa posto.

Link al commento
Condividi su altri siti

Io ho provato il seguente codice, liberamente scopiazzato dal link di Fransys, ma non ne vuol sapere di funzionare.

Ho messo un timer con la proprietà enabled = false, poi ho messo un pulsante che in teoria dovrebbe spegnere il monitor e abilitare il timer. Arrivato a 10 secondi, quest'ultimo dovrebbe riaccendere il monitor. Però non va.

Vi posto il codice:

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

Public Enum MonitorState

MonitorOn = -1

MonitorOff = 2

MonitorStandby = 1

End Enum

Public Sub SetMonitorState(frmForm As Form, eState As MonitorState)

Dim lngResult As Long

lngResult = SendMessage(frmForm.hwnd, &H112, &HF170, eState)

End Sub

Private Sub off_Click()

Beep

Call SetMonitorState(Form1, MonitorOff)

Me.Timer1.Interval = 10000

Me.Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer()

Call SetMonitorState(Form1, MonitorOn)

End Sub

Link al commento
Condividi su altri siti

Eureka: questa funziona.

Const KEYEVENTF_EXTENDEDKEY = &H1 'pressione del tasto (keyDown)

Const KEYEVENTF_KEYUP = &H2 'rilascio del tasto premuto (keyUp)

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Sub Timer1_Timer()

Beep

keybd_event vbKeyA, 0, KEYEVENTF_EXTENDEDKEY, 0 'simula la pressione del tasto "A"

keybd_event vbKeyA, 0, KEYEVENTF_KEYUP, 0 'simula il rilascio del tasto "A"

End Sub

Io ho provato con un timer impostato a 65 secondi e lo spegnimento del monitor a 60 secondi, e va: il monitor ritorna attivo.

Link al commento
Condividi su altri siti

Salve Stefano,

Concordando con tutto i post precedentemente impostati posso aggiungere qualche

considerazioni in merito:

In win. ci sono 2 versioni di libreria disponibili per screen saver functions:

Scrnsave.lib , per caratteri ANSI ,compatibile con tutte le piattaforme win.

Scrnsavw.lib , per caratteri UNICODE , solo per unicode.

Quindi, bisogna in ansi tutto linkare la tua API con una di questi libs, per cosi potere

accedere al codice di startup necessario per un performance di screen saver.

Le 3 funzione richieste in un screen saver module sono:

ScreenSaverProc: che processa messaggi del tipo

WM_CREATE: per inizializzazione dei dati,etc, dal Regedit.ini file.Settaggio del window timer per

il screen saver.

WM_ERASEBKGND : cancella il screen saver window.

WM_TIMER : performa operazioni di disegno

WM_DESTROY : distrugge il timer precedentemente creato.

Poi, questa funzione passa anche i messagi non processati (idle) alla screen saver lib.chiamando

DefScreenSaverProc.

Questi messagi sono:

WM_SETCURSOR nasconde il cursore.

WM_PAINT vernicia il screen background.

WM_LBUTTONDOWN Termina il screen saver.

WM_MBUTTONDOWN Termina il screen saver.

WM_RBUTTONDOWN Termina il screen saver.

WM_KEYDOWN Termina il screen saver.

WM_MOUSEMOVE Termina il screen saver.

WM_ACTIVATE Termina the screen saver se il wParam is settato FALSE.

ScreenSaverConfigureDialog :

Mostra un dialog box permettendo al utente di configurare il screen saver.

Potresti fare a meno di questa performance, settando valori costanti nella inizializz se vuoi.

RegisterDialogClasses :

Importante solo se la tua api performa delle propieta'speciali nel dialog box di config.del screen

saver, usando questa funzione per registrare la corrispondente window classe, puoi fare a meno anche qua.

Come chiamare queste funzione dalla tua sorgente:

Beh,VB non e' la mia main key quindi non posso aiutare con dei essempi,ma comunque quello che necessita

fare e'intercettare ed overwrite gli appositi messaggi lanciati dalla windows main message pump,

visto che il OS a gia' in itinerario queste performance per base.

Vai a vedere su qualche info del VB come accedere alla Screen Saver Library e come potere implementare

aggiungendo ed inviando dei messaggi alla main message pump del OS.

Poi, puoi aggiungere un messaggio alla pump che se c'e' un allarme termina il screen saver.

Questa sarebbe anche la procedura piu' in linea con il main module, che forse sta' gia' provedendo

una screen server performance .

Saluto.

Link al commento
Condividi su altri siti

'rca ho avuto un bel colpo di ..fortuna eheheh

Stefano volevo dirti che io l'ho fatto sul pulsante A, e qualunque pulsante non dovrebbe creare problemi.

Forse però è meglio scrivere la routine che punta ad un tasto freccia.

Ora però mi chiedo perchè la routine copiata dal link di Fransys non funziona. In realtà mi è capitata una cosa

del genere già un'altra volta: ho copiato una routine che doveva mandare in shutdown diretto il pc, ma non ha funzionato. Ne ho rpvata un'altra che mi fa apparire la finestra di arresto di Windows, che può andare comunque (meglio di niente).

Il fatto strano è che la routine che non funziona non mi genera nessun errore o nessun blocco. La stessa cosa

mi succede con la routine di Fransys. Ho pensato a dei riferimenti dimenticati, ma in questo caso mi si doveva generare un errore penso...

Modificato: da Hellis
Link al commento
Condividi su altri siti

Stefano Sormanni

sul file winapi.txt ci sono 800 kb di routine.... :huh:

P.S. volevo provare anzichè con un tasto, il movimento del mouse, forse è più corretto.....

Modificato: da Stefano Sormanni
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...