Stefano Sormanni Inserito: 29 novembre 2004 Segnala Inserito: 29 novembre 2004 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
Livio Orsini Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 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.
Hellis Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 (modificato) 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: 29 novembre 2004 da Hellis
Livio Orsini Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 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ù.
Hellis Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 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 provaPrivate Sub Timer1_Timer()BeepSendKeys "{Home}+{End}"End Subdove 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
Stefano Sormanni Inserita: 29 novembre 2004 Autore Segnala Inserita: 29 novembre 2004 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à ?
Hellis Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 (modificato) 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: 29 novembre 2004 da Hellis
Livio Orsini Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 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.
bigalex Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 Ciao Livio.Quale è la "Bibbia per le API" in tuo possesso ?bigalex
Livio Orsini Inserita: 29 novembre 2004 Segnala Inserita: 29 novembre 2004 Visual Basic Win32 API - Guida del programmatore.Poù anche il mitico "HardCore Visual Basic" di Bruce McKinney
Hellis Inserita: 30 novembre 2004 Segnala Inserita: 30 novembre 2004 Visual Basic Win32 API - Guida del programmatore.
Hellis Inserita: 30 novembre 2004 Segnala Inserita: 30 novembre 2004 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 LongPublic Enum MonitorState MonitorOn = -1 MonitorOff = 2 MonitorStandby = 1End EnumPublic Sub SetMonitorState(frmForm As Form, eState As MonitorState) Dim lngResult As Long lngResult = SendMessage(frmForm.hwnd, &H112, &HF170, eState)End SubPrivate Sub off_Click()BeepCall SetMonitorState(Form1, MonitorOff)Me.Timer1.Interval = 10000Me.Timer1.Enabled = TrueEnd SubPrivate Sub Timer1_Timer()Call SetMonitorState(Form1, MonitorOn)End Sub
Hellis Inserita: 30 novembre 2004 Segnala Inserita: 30 novembre 2004 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 SubIo ho provato con un timer impostato a 65 secondi e lo spegnimento del monitor a 60 secondi, e va: il monitor ritorna attivo.
Savino Inserita: 30 novembre 2004 Segnala Inserita: 30 novembre 2004 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 potereaccedere 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 tipoWM_CREATE: per inizializzazione dei dati,etc, dal Regedit.ini file.Settaggio del window timer peril screen saver.WM_ERASEBKGND : cancella il screen saver window.WM_TIMER : performa operazioni di disegnoWM_DESTROY : distrugge il timer precedentemente creato.Poi, questa funzione passa anche i messagi non processati (idle) alla screen saver lib.chiamandoDefScreenSaverProc.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' provedendouna screen server performance .Saluto.
Stefano Sormanni Inserita: 1 dicembre 2004 Autore Segnala Inserita: 1 dicembre 2004 Ho provato la routine di Hellis, funziona egregiamente! ... grazie
Hellis Inserita: 1 dicembre 2004 Segnala Inserita: 1 dicembre 2004 (modificato) 'rca ho avuto un bel colpo di ..fortuna ehehehStefano 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 cosadel 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: 1 dicembre 2004 da Hellis
Stefano Sormanni Inserita: 1 dicembre 2004 Autore Segnala Inserita: 1 dicembre 2004 (modificato) sul file winapi.txt ci sono 800 kb di routine.... P.S. volevo provare anzichè con un tasto, il movimento del mouse, forse è più corretto..... Modificato: 1 dicembre 2004 da Stefano Sormanni
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora