2011-11-04 13 views
10

Ecco la situazione. La società per cui lavoro crea questo software in C che può rendere un computer Windows un po 'come un televisore. In sostanza, il nostro software è pensato per essere riprodotto a schermo intero e il contenuto viene visualizzato da Internet senza che l'utente debba mai più toccare il computer.Evitare tutti i messaggi di sistema e i messaggi da altri software

Il problema è che una volta ogni tanto il sistema richiama pop-up come "Il tuo sistema Windows è pronto per un aggiornamento." oppure "Si prega di rinnovare l'abbonamento Norton" ecc. che l'utente deve rimuovere periodicamente e manualmente.

C'è un modo per visualizzare il contenuto a schermo intero senza essere disturbato da tali avvertimenti?

+4

Hmya, questi messaggi sono molto importanti. Considerare la tua app più importante è una battaglia difficile da vincere. È anche piuttosto discutibile sopprimere la notifica "Motherboard is on fire". Dovrai convincere Windows che l'utente sta attivamente utilizzando la finestra. Un po 'difficile con un'app TV. È possibile generare alcuni input falsi con la funzione SendInput(). –

+5

Lol, non sapevo che c'era una notifica "Scheda madre in fiamme" – Randomblue

+5

Si potrebbe testarlo con una torcia. –

risposta

13

Yah, indipendentemente dal fatto che la comunità di sviluppo sia d'accordo, Microsoft ha diversi standard per quando e perché potrebbe essere accettabile l'uso esclusivo del monitor.

La strategia più ufficiale è utilizzare DirectX in modalità esclusiva. Ecco cosa fanno i giochi, cosa fa Windows Media Player in video a schermo intero con accelerazione hardware abilitata, ecc ... Se la tua applicazione è multimediale (come suggerito dalla funzionalità TV), probabilmente dovresti usare anche DirectX . Oltre a darti l'esclusivo accesso al display, aumenterà anche le prestazioni delle tue applicazioni riducendo al contempo il carico della CPU (poiché sovraccaricherà la grafica sulla scheda video quando possibile).

Se DirectX non è un'opzione, è disponibile un gran numero di hack che sembrano comportarsi in modo diverso tra varie generazioni di sistemi operativi Windows. Quindi potrebbe essere necessario essere pronti a implementare diverse tecniche per coprire ogni sistema operativo che si intende supportare.

Una tecnica consiste nell'impostare l'applicazione come salvaschermo attualmente in esecuzione. Uno screensaver se in realtà solo un EXE rinominato in SCR con determinati switch a linea di comando dovrebbe supportare. Ma puoi scrivere la tua applicazione per essere uno screensaver e un piccolo stub di avvio che lo imposta come salvaschermo e lo avvia. All'uscita l'applicazione dovrebbe restituire le impostazioni originali del salvaschermo (forse il programma di avvio attende che il processo venga chiuso in modo che restituisca le impostazioni in entrambe le uscite aggraziate e tutte le terminazioni del processo non pianificate, vale a dire: arresto anomalo dell'app). Non sono sicuro che questo comportamento sia coerente su tutte le piattaforme, dovrai testarlo.

Prevenire altre applicazioni dalla creazione di handle di finestre è davvero un problema a mio avviso e piuttosto brutto che non apprezzerei come cliente di tale software.

Una costante BringWindowToTop() chiamata per tenervi di fronte è migliore (non infrange altro software) ma ancora un po 'hack-ish.

7

Messaggi di creazione finestra di cattura con un hook globale. In questo modo puoi chiudere o nascondere le finestre indesiderate prima che diventino visibili.

MODIFICA: Se si desidera assolutamente evitare gli hook, è possibile chiamare periodicamente una funzione, che posiziona la finestra in cima allo stack z.

+1

Sento che un tale tipo di aggancio è un po 'eccessivo ...: S –

+1

Ho avuto lo stesso problema qualche anno fa e non ho trovato alcun metodo più semplice. È particolarmente brutto che tu debba usare una DLL per il codice dell'hook globale. – kol

3

Se non avete bisogno di tastiera o il mouse, come su di eseguire l'applicazione come un screensaver?

3

Molti messaggi di Those vengono attivati ​​/ gestiti da Esplora risorse. Basta sostituirlo con il manichino C#/winform. Modificando il valore di registro

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] 
"Shell"="Explorer.exe" 

È possibile specificare qualsiasi exe come alternativa al explorer.exe Questo è il modo in cui tutte le finestre sistema basato (embedded) (ATM & co) fanno. C'è ancora qualche regolazione (disabilita i servizi che non ti servono/dr watson &) e, naturalmente, ti consigliamo di mantenere una backdoor "restart explorer.exe". Ma questo è un buon inizio

+0

In questo modo, otterrete il supporto specifico ed efficiente direttamente da Microsoft (se necessario), e soprattutto, che non implicano alcun errore. – 131

+0

I messaggi di aggiornamento di Windows potrebbero essere attivati ​​da explorer, ma sicuramente non "brindisi" di terze parti. A parte il già citato Norton, MS Outlook, google talk, msn messanger, ecc. Come sviluppatore C#, creo anche i miei messaggi personali in alcune delle mie app che non dipendono da explorer. Suppongo che la mia ipotesi sopra sia che si trattava di un'app consumer e non di un dispositivo embedded o che potevano anche ottenere la licenza di un sistema operativo embedded di Microsoft come XP embedded. Questa è una versione ridotta di Windows, progettata esattamente per il tuo suggerimento come dispositivo dedicato. – BenSwayne

Problemi correlati