Windows Embedded Standard 7: I filtri verso l'interfaccia
(Post 4 di 4)
Questo è il quarto ed ultimo post di un articolo che tratta
l'argomento dei filtri verso l'interfaccia. In particolare ci
occuperemo di:
Filtro dei messaggi (Dialog box filter)
Configurazione mediante ICE
Configurazione mediante IBW
Installazione mediante DISM
Esempio pratico
I filtri verso l'interfaccia - conclusioni di tutto
l'articolo
_________________________________________
Filtro dei messaggi (Dialog box filter)
Poiché, come abbiamo visto, la Message
box non è l'unica funzione che permette di
interagire con l'utente, Microsoft ha messo a disposizione un nuovo
filtro che agisce a livello di finestra.
Questo filtro permette di definire una serie di parametri che
caratterizzano la finestra (Es: il nome del processo, il nome della
classe ed il titolo della finestra) e l'azione da compiere prima
della sua visualizzazione (es: chiudi, iconizza, massimizza o una
lista di pulsanti). Queste definizioni vengono prese in carico da
un servizio che, poco prima che la finestra venga visualizzata,
attua su di essa l'azione che è stata scelta. E' importante
evidenziare che per utilizzare questo filtro bisogna "conoscere" la
finestra su cui si vuole agire.
Il filtro è ottenuto tramite un servizio Windows basato su un
file di configurazione che, quando è attivo, cattura tutte le
finestre nel momento in cui vengono create. Quando l'applicativo
chiede una visualizzazione, il servizio confronta i dati della
finestra con quelli del filtro e, se i dati di individuazione della
finestra coincidono con una delle righe del file di configurazione,
esegue l'azione prevista.
Il file di configurazione, chiamato
ConfigurationList.XML , è
posizionato (di default) nel disco di sistema, nella cartella
ProgramData\Microsoft\DialogFilter.
Per identificare la finestra su cui si vuole agire, è possibile
utilizzare il "visualizzatore eventi" di Windows, dopo averne
abilitato la funzione di LOG, oppure utilizzare un applicativo che
fa parte del pacchetto Windows Embedded Studio 7 di nome "Dialog
Filter Editor" (DialogFilterEditor.exe) e
si che trova (di default) nella cartella:
"C:\Program Files\Windows Embedded Standard
7\EmbeddedSDK\bin"
Note:
· Nella cartella en-us, posizionata
nello stesso percorso, troviamo il file
DialogFilterEditor.exe.mui che contiene
le risorse indispensabili
per il corretto funzionamento dell'applicativo!
· Si sconsiglia di modificare (e/o di creare) il file .XML
manualmente; esso deve infatti seguire uno schema di base fornito
da "ConfigurationListSchema.xsd". Nella pratica, per la creazione
del file si consiglia di utilizzare l'applicativo
DialogFilterEditor.exe e soltanto in casi in cui sia veramente
necessario modificare a mano il file con un XML-editor (UTF-8).
· I messaggi di sicurezza (come ad esempio quelli UAC=User
Account Control) non vengono filtrati: si consiglia di configurare
la sicurezza in modo che venga controllata in automatico senza
chiedere conferma all'utente. In questo modo:
o gli utenti addetti alla manutenzione del dispositivo Embedded
(tipicamente con i diritti di amministratore locale) saranno
abilitati in automatico senza ulteriori conferme (attenzione a
questa situazione, perché porta in sé una diminuzione della
sicurezza);
o gli utenti che devono utilizzare il dispositivo (tipicamente
senza i diritti di amministratore locale) saranno incapaci di
effettuare azioni che avrebbero bisogno di conferme; questa
situazione va nella giusta direzione, in quanto limita l'utente a
rimanere entro le scelte messe a disposizione
dall'applicazione.
Filtro dei messaggi (configurazione mediante ICE)
Dopo aver inserito nella build il package "Dialog Box Filter"
(DBF) che si trova tra le "Embedded Enabling Features".
Abbiamo a disposizione queste scelte:
· Il Path, se impostato, istruisce il servizio su dove andare a
caricare il file ConfigurationList.XML
per poter intercettare correttamente le finestre. Il path di
default è:
ProgramData\Microsoft\DialogFilter\ , che
è una cartella con attributi "System+Hidden" del disco di
sistema;
· La tripletta: Dominio, Username e Password serve ad impostare
le credenziali di dove si trova il file, che può essere posizionato
sia internamente al dispositivo sia in un percorso di rete.
Abbiamo la possibilità di inserire direttamente il file
ConfigurationList.XML nell'immagine che
si sta preparando con il configuratore (ICE) posizionando il file
nella Distribution Share (nel nostro esempio: DSSP1),
ricreandone il percorso che dovrà avere nel dispositivo target. Nel
nostro caso, supponendo che la cartella sul dispositivo sarà quella
di default
%SystemDrive%\ProgramData\Microsoft\DialogFilter
dovremo posizionare il file nella Distribution Share nel ramo
"$OEM$ Folders":
%distributionshareroot%\$OEM$
Folders\DialogFilter\$OEM$\$1\ProgramData\Microsoft\DialogFilter\
Per identificare la nostra Distribution Share
all'interno del Configuratore (ICE):
· Posizioniamoci sulla Colonna di sinistra della
Distribution Share e clicchiamo con il tasto
destro del mouse sulla prima riga della colonna: "la radice";
· Sulla lista che si presenta selezioniamo "Explore Distribution
Share";
· Il configuratore (ICE) aprirà direttamente una finestra di
"Esplora risorse" sulla cartella della Distribution
Share.
Per creare il file
ConfigurationList.XML che contiene la
lista delle finestre su cui vogliamo intervenire, utilizziamo
l'applicativo DialogFilterEditor mentre le
finestre sono attive sullo schermo e scegliamo, per ognuna di loro,
l'azione che deve compiere il Servizio DialogFilter prima che la
finestra sia visualizzata (riferirsi al paragrafo degli esempi
pratici più avanti).
Quando avrete terminato la compilazione della lista, chiedete
all'applicativo di salvare i dati nel file
ConfigurationList.XML e quindi copiatelo
nella cartella del ramo $OEM$ Folders creata in
precedenza.
All'interno di ICE bisognerà configurare
OEMFolderPaths del package
Foundation Core\Windows Embedded
Edition\Setup-x86.
Il modo più veloce e sicuro per farlo è:
· Posizionarsi sulla colonna della Distribution Share
ed aprire, con un click, la cartella $OEM$
Folders;
· doppio click sulla cartella
DialogFilter;
· L'ambiente di configurazione (ICE):
o creerà automaticamente gli elementi di una nuova sezione di
Path&Credentials con i dati corretti del
path;
o selezionerà il filtro per i passi di configurazione (Filter
view by) a "1WindowsPE";
o si posizionerà sulla sezione creata per permettere l'eventuale
inserimento delle credenziali.
Si otterrà una situazione come in figura:
Completate tutte le altre configurazioni e validata la build, si
procederà come al solito facendo creare all'ambiente l'immagine ISO
(o direttamente il supporto di installazione: chiavetta o disco
USB, CF, ecc...) passando da Tools/Create Media/Create
IBW Image From Answer file. Alla fine della
generazione si potrà notare come il percorso creato nella
cartella:
…\AutoUnattend_Files\windowsPE\$OEM$
Folders\DialogFilter\$OEM$\$1
della Distribution Share ha creato il percorso voluto nel
sistema target:
\ProgramData\Microsoft\DialogFilter
con dentro il nostro file di configurazione:
ConfigurationList.XML
Note:
· Il dispositivo così creato partirà direttamente con
l'installazione della build e, se abbiamo già preparato tutte le
risposte alle domande d'installazione, non si fermerà fino ad
installazione completata.
· L'installazione di default parte già con il filtro dei
messaggi (Dialog Box Filter) attivo.
· L'eventuale correzione del file di configurazione avrà effetto
soltanto dopo un riavvio del servizio.
Filtro dei messaggi (configurazione mediante IBW)
Utilizzando il Wizard (IBW) ci si limiterà ad inserire il
package "Dialog Box Filter" nella build e, a Run-Time, si
interverrà, con le dovute cautele, sulle chiavi di registro che
pilotano questo filtro. Con riferimento alle variabili di cui sopra
risulta che, per abilitare la funzionalità in toto, bisogna agire
sulle variabili della chiave:
HKLM\System\CurrentControlSet\services\DialogFilter
\parameters
Riportiamo le chiavi che ci potrebbero interessare con i loro
valori di default:
…\parameters\ConfigList=%SystemDrive%\ProgramData\Microsoft\DialogFilter\ConfigurationList.XML
…\parameters\ConfigSchema=%SystemDrive%\ProgramData\Microsoft\DialogFilter\ConfigurationListSchema.xsd
…\parameters
\ServiceDll=%systemRoot%\System32\DialogFilterSvc.dll
Una volta che IBW ha inserito il servizio nel sistema sarà cura
del sistemista, dopo le opportune prove, preparare il disco MASTER
per la clonazione.
Filtro dei messaggi (configurazione mediante DISM)
Utilizziamo il tool DISM (Deployment Image Servicing and
Management) per aggiungere "OnLine" (cioè sul sistema che sta
girando) il singolo package "Dialog Box Filter" ad un sistema
costruito in precedenza senza questo package.
Per compiere l'operazione di aggiunta bisogna seguire dei
semplici passi:
1) Controllare che il package che si vuole aggiungere NON abbia
altre dipendenze da package NON inseriti nel sistema;
2) Individuare il nome del package che si vuole inserire e la
sua posizione;
3) Rendere disponibile il package al sistema che si vuole
aggiornare;
4) Eseguire il comando di aggiunta del package "OnLine".
Vediamo come:
1) Supponiamo che l'Answer File di
partenza del nostro sistema sia "Validato", ma che non contenga il
Package "Dialog Box Filter":
a. Si apre il file di costruzione del nostro sistema con il
configuratore (ICE);
a. Si aggiunge il package
"\FeaturePack\EmbeddedEnablingFeatures\ Dialog Box Filter";
b. Si esegue la validazione della build;
c. Si salva questa nuova versione dell'Answer
File con un nome diverso dall'originale;
d. Si controlla che le differenze tra i due Answer
File siano soltanto legate all'aggiunta del package
"Dialog Box Filter", dovrebbero esserci soltanto queste "cinque"
righe:
<package action="install">
<assemblyIdentity name="WinEmb-Dialog-Filter"
version="6.1.7601.17514" processorArchitecture="x86"
publicKeyToken="31bf3856ad364e35" language="neutral"
versionScope="nonSxS" />
<source
location="%distributionshareroot%\Packages\FeaturePack\x86~winemb-dialog-filter~~~~6.1.7601.17514~1.0\winemb-dialog-filter.cab"
/>
<ew:packageInfo releaseType="Feature Pack"
customInfoVersion="1.0" />
</package>
2) Il nome del package e il percorso dove si trova il suo file
di installazione si possono desumere direttamente
dall'Answer File nella riga "source
location":
"%distributionshareroot%\Packages\FeaturePack\x86~winemb-dialog-filter~~~~6.1.7601.17514~1.0\winemb-dialog-filter.cab"
Oppure, nell'ambiente del configuratore (ICE), ci si posiziona
nella colonna centrale dell'Answer File e
si effettua un doppio click sul package Dialog Box
Filter:
sulla destra, l'elemento Path del folder
properties ci darà il nome della cartella dove si
trova il package ed il suo nome corretto.
3) Copiamo il file d'installazione (.CAB) in un posto dove
potremo raggiungerlo dal sistema che vogliamo aggiornare (ad
esempio, sulla cartella principale una chiavetta USB).
4) Supponiamo che la chiavetta di cui sopra per il sistema che
vogliamo aggiornare si chiami "E:". Per eseguire il comando:
e. Aprire un prompt di comandi con i diritti di
amministratore;
f. Dare il comando:
dism /online /add-package /PackagePath:E:\
winemb-dialog-filter.cab
Il sistema risponderà con una serie di messaggi:
Deployment Image Servicing and Management tool
Version: 6.1.7600.16385
Image Version: 6.1.7601.17514
Processing 1 of 1 - Adding package
WinEmb-Dialog-Filter~31bf3856ad364e35~x86~~6.1.7601.17514
poi farà comparire una barra di progressione fatta a caratteri,
che, raggiunto il 100%, si presenterà così:
[==========================100.0%==========================]
The operation completed successfully.
Restart Windows to complete this operation.
Do you want to restart the computer now (Y/N)?
Al riavvio Il sistema completerà l'installazione.
Nota: Il servizio installato con questo package
è subito abilitato anche se mancherà il file di configurazione
(ConfigurationList.XML ) che lo
pilota.
Filtro dei messaggi (Esempio pratico)
Per meglio comprendere il funzionamento di questo servizio,
abbiamo creato una semplice applicazione .NET, chiamata
Test_1 che visualizza una
Message
box di nome Test con
tre pulsanti: Annulla,
No e Sì
(Sì è la selezione di default) e, a
prescindere dal pulsante premuto, visualizza una finestra, chiamata
Form1, che presenta soltanto un pulsante
con la "stringa" della funzione del pulsante premuto in precedenza:
anche se la prima finestra che compare può essere gestita con la
risposta standard ai messaggi (MBDR), la si può intercettare anche
con il filtro dei messaggi (DBF). Questa scelta può essere dovuta
al fatto che usare la risposta standard ai messaggi è una
configurazione globale del sistema, mentre il filtro dei messaggi è
un intervento mirato al messaggio specifico.
Scendendo nella pratica del nostro esempio, per prima cosa
controlliamo che il servizio DialogFilter
NON sia attivo e che la chiave di registro per il filtro di
risposta standard dei messaggi (MBDR) NON sia abilitato, in modo da
capire come evolve l'applicazione completamente senza
filtri:
Utilizzando l'applicazione per la gestione dei servizi di
Windows (con diritti di amministratore) Servizi di
Windows,fermiamo il servizio DialogFilter;
oppure, da un prompt di comandi avendo i diritti di
amministratore:
sc stop dialogfilter
Il servizio si presenterà così:
Se dovesse presentarsi l'errore 15100 è perché il servizio non
ha trovato il suo file di configurazione;
Lo stato lasciato in bianco significa "NON Avviato";
Utilizzando l'editor del registro di Windows (con diritti di
amministratore) Regedit, navighiamo fino
alla chiave:
HKLM\System\CurrentControlSet\Control\Error
Message Instrument
e controlliamo che la variabile di abilitazione sia a zero:
EnableDefaultReply=0
Nota: Per poter utilizzare gli applicativi di
amministrazione sul PC-Target bisogna includere nella build i
pacchetti che li contengono; ad esempio, per
Regedit il pacchetto è:
FeaturePack\Management\System Management\System
Management Utilities.
Per trovare il pacchetto corretto si consiglia di:
• utilizzare la funzione "Find" (Ctrl-F)
dell'ambiente del configuratore (ICE);
• di selezionare l'opzione "Search file names in packages";
• e di cercare "Regedit.exe".
Con un doppio clidk sulla riga corrispondente ci si ritroverà
già nella colonna della Distribution Share con il package corretto
selezionato.
Lanciamo ora l'applicativo Test_1 ed
otteniamo:
Clicchiamo, ad esempio, il pulsante No nella
Message
box ottenendo:
se clicchiamo su quest'altro pulsante No
l'applicativo ci ripropone la Message
box iniziale. Si possono provare gli altri
pulsanti della prima maschera oppure chiudere l'applicativo
cliccando sulla X in alto a destra della maschera
Form1.
Rilanciamo ora l'applicativo Test_1 e
rimaniamo sulla prima finestra.
A questo punto lanciamo l'applicativo
DialogFilterEditor (con i diritti di
amministratore), in modo che la finestra che vogliamo
intercettare sia già visualizzata. Se si chiudono tutte le altre
finestre e si aggiorna la schermata (F5 oppure
Settings/Refresh), rimarranno soltanto
queste due finestre:
Cliccando due volte sulla riga della finestra di
Test nella lista delle "Visible Windows"
l'applicativo enumera le informazioni della finestra: Process,
Class e Title.
Cliccando due volte sul nome del processo
test_1.exe l'applicativo visualizza una
nuova finestra che riporta le informazioni precedenti e richiede di
selezionare l'opzione da utilizzare su questa finestra:
Annulla, Chiudi,
No, e Sì.
Nota: Nella lista delle azioni selezionabili
vengono riportati, oltre ai pulsanti della finestra
Chiudi, anche quelli dell'applicazione
Annulla, No e Sì; questo ci da la
possibilità di gestire la finestra proprio come ci serve, scendendo
in un dettaglio che fino ad ora non ci era concesso, utilizzando i
filtri a nostra disposizione. L'alternativa possibile era quella di
"scriversi" un filtro personalizzato che rimaneva in attesa della
preparazione della finestra e la "gestiva" prima della sua
effettiva visualizzazione.
Scegliamo "Chiudi" e premiamo
OK:
Nella colonna Action comparirà:
Chiudi
A questo punto si può chiedere all'applicativo
DialogFilterEditor di salvare il file di
configurazione (XML) per poterlo poi far elaborare al servizio:
sulla riga comando scegliere "file" e poi
"save as" ed un nome che dovrà essere
ConfigurationList.XML nella cartella
%SystemDrive%\ProgramData\Microsoft\DialogFilter.
Ecco il contenuto del file:
<?xml version="1.0" encoding="utf-8"?>
<CL:dialogs xmlns:CL="urn:Dialogs">
<dialog>
<ProcessImageName>test_1.exe</ProcessImageName>
<Title>Test</Title>
<Class>#32770</Class>
<Buttons>
<Button>Sì</Button>
<Button>No</Button>
<Button>Annulla</Button>
<Button>Chiudi</Button>
</Buttons>
<Actions>
<Action>Chiudi</Action>
</Actions>
</dialog>
</CL:dialogs>
A questo punto facciamo partire il servizio DialogFilter
e lanciamo l'applicativo Test.
Utilizzando l'applicazione per la gestione dei servizi di
windows (con diritti di amministratore) Servizi di
Windows attiviamo il servizio DialogFilter,
oppure da un prompt di comandi avendo i diritti di
amministratore:
sc start dialogfilter
Lanciamo ora l'applicativo Test_1 ed
otteniamo direttamente:
Otterremo direttamente la seconda finestra perchè la prima è
stata filtrata dal servizio simulando la pressione del pulsante
X.
Andiamo avanti supponendo di voler intercettare e neutralizzare
anche questa seconda finestra quindi chiudiamo l'applicazione
Test_1, fermiamo di nuovo il
servizio:
sc stop dialogfilter (da un prompt di comandi con diritti di
amministratore)
Rilanciamo l'applicativo
DialogFilterEditor (con i diritti di
amministratore), chiudiamo tutte le altre finestre e
dalla riga comando scegliamo "file" e
"Open..." carichiamo il file
ConfigurationList.XML della cartella
%SystemDrive%\ProgramData\Microsoft\DialogFilter
ed otteniamo:
Rilanciamo l'applicazione Test_1 e
clicchiamo sul pulsante X per chiudere la
prima finestra:
Comparirà la seconda finestra (Form1) con il
pulsante Cancel:
Torniamo sull'applicativo
DialogFilterEditor e dalla riga comando
scegliamo "Settings" e "Refresh",
comparirà un elemento Form1. Se clicchiamo due
volte su Form1 nella lista delle "Visible
Windows", l'applicativo enumera le informazioni della finestra:
Process, Class e Title. ed otteniamo:
Cliccando due volte sul nome del processo
test_1.exe della riga con il "Title"
Form1 l'applicativo visualizza una nuova
finestra che riporta le informazioni precedenti e richiede di
selezionare l'opzione da utilizzare su questa finestra:
Cancel, Chiudi, Ingrandisci, Riduci a
icona:
Scegliamo "Chiudi" e premiamo
OK: nella colonna Action
comparirà: Chiudi
A questo punto si chiede all'applicativo
DialogFilterEditor di salvare il file di
configurazione (XML) per poterlo poi dare in pasto al servizio:
sulla riga comando scegliere "file", poi
"save" (il nome e il percorso sono già corretti) e
possiamo chiudere il DialogFilterEditor.
Ecco il contenuto aggiornato del file
ConfigurationList.XML :
<?xml version="1.0" encoding="utf-8"?>
<CL:dialogs xmlns:CL="urn:Dialogs">
<dialog>
<ProcessImageName>test_1.exe</ProcessImageName>
<Title>Test</Title>
<Class>#32770</Class>
<Buttons>
<Button>Sì</Button>
<Button>No</Button>
<Button>Annulla</Button>
<Button>Chiudi</Button>
</Buttons>
<Actions>
<Action>Chiudi</Action>
</Actions>
</dialog>
<dialog>
<ProcessImageName>test_1.exe</ProcessImageName>
<Title>Form1</Title>
<Class>WindowsForms10.Window.8.app.0.378734a</Class>
<Buttons>
<Button>Cancel</Button>
<Button>Riduci a icona</Button>
<Button>Ingrandisci</Button>
<Button>Chiudi</Button>
</Buttons>
<Actions>
<Action>Chiudi</Action>
</Actions>
</dialog>
</CL:dialogs>
A questo punto facciamo partire il servizio
"DialogFilter":
sc start dialogfilter (da un prompt di comandi con diritti di
amministratore)
lanciamo l'applicativo Test_1: a schermo non
compariranno né la prima e né la seconda finestra.
I filtri verso l'interfaccia - conclusioni di tutto
l'articolo
Per proteggere la nostra applicazione dai messaggi che arrivano
dal sistema o dalle altre applicazioni, possiamo usare la risposta
standard ai messaggi (Message Box Default Reply),
disabilitare i "fumetti" (Balloons) o configurare
opportunamente i filtri dei messaggi (Dialog Box
Filter). Con le prime due soluzioni otteniamo una modifica
globale al sistema; con l'ultima possiamo migliorare la granularità
della configurazione. Questo è molto efficace se dobbiamo
neutralizzare "chirurgicamente" alcune finestre che compaiono
quando non vorremmo, ma diventa un lavoro oneroso all'aumentare del
numero delle finestre da gestire: basti pensare alla localizzazione
dei pulsanti che ci costringe ad una diversificazione dei file di
configurazione in base alla lingua utilizzata.
____________________________________
Questo articolo è stato scritto, curato nei particolari oltre
che da me anche da due miei colleghi: Gianni Rosa Gallina (blog)
eMVP e Marina Sabetta.
Per ulteriori informazioni potete riferirVi a questi
collegamenti (in inglese):
http://msdn.microsoft.com/en-us/library/ff793549(v=winembedded.60)
http://msdn.microsoft.com/en-us/library/ff794009(v=winembedded.60).aspx
http://msdn.microsoft.com/en-us/library/ee832759.aspx