ID modello utente applicazione (AppUserModelIDs)

Gli ID modello utente applicazione (AppUserModelIDs) vengono usati ampiamente dalla barra delle applicazioni in Windows 7 e nei sistemi successivi per associare processi, file e finestre a una determinata applicazione. In alcuni casi, è sufficiente basarsi sull'AppUserModelID interno assegnato a un processo dal sistema. Tuttavia, un'applicazione che possiede più processi o un'applicazione in esecuzione in un processo host potrebbe dover identificarsi in modo esplicito in modo che possa raggruppare le finestre altrimenti diverse sotto un singolo pulsante della barra delle applicazioni e controllare il contenuto dell'elenco jump dell'applicazione.

Application-Defined e System-Defined AppUserModelID

Alcune applicazioni non dichiarano un AppUserModelID esplicito. Sono facoltativi. In tal caso, il sistema usa una serie di euristici per assegnare un AppUserModelID interno. Tuttavia, esiste un vantaggio per le prestazioni per evitare tali calcoli e un AppUserModelID esplicito è l'unico modo per garantire un'esperienza utente esatta. È pertanto consigliabile impostare un ID esplicito. Le applicazioni non possono recuperare un AppUserModelID assegnato al sistema.

Se un'applicazione usa un AppUserModelID esplicito, deve anche assegnare lo stesso AppUserModelID a tutte le finestre o processi in esecuzione, collegamenti e associazioni di file. Deve inoltre usare AppUserModelID durante la personalizzazione del jump list tramite ICustomDestinationList e in qualsiasi chiamata a SHAddToRecentDocs.

Nota

Se le applicazioni non dispongono di un appUserModelID esplicito, devono chiamare IApplicationDestinations, IApplicationDocumentLists e ICustomDestinationList e SHAddToRecentDocs dall'applicazione. Se questi metodi vengono chiamati da un altro processo, ad esempio un programma di installazione o un programma di disinstallazione, il sistema non può generare il corretto AppUserModelID e tali chiamate non avranno alcun effetto.

 

Gli elementi seguenti descrivono scenari comuni che richiedono un AppUserModelID esplicito. Indicano anche casi in cui devono essere usati più AppUserModelID espliciti.

  • Un singolo file eseguibile con un'interfaccia utente con più modalità che appaiono all'utente come applicazioni separate deve assegnare diversi AppUserModelID a ogni modalità. Ad esempio, una parte di un'applicazione che gli utenti vedono come un'esperienza indipendente che possono aggiungere e avviare dalla barra delle applicazioni separatamente dal resto dell'applicazione devono avere il proprio AppUserModelID, separato dall'esperienza principale.

  • Più collegamenti con argomenti diversi che portano a ciò che l'utente vede come la stessa applicazione deve usare un AppUserModelID per tutti i collegamenti. Ad esempio, Windows Internet Explorer include collegamenti diversi per diverse modalità ,ad esempio l'avvio senza componenti aggiuntivi, ma tutti devono essere visualizzati all'utente come singola istanza di Internet Explorer.

  • Un eseguibile che funge da processo host ed esegue il contenuto di destinazione come applicazione deve essere registrato come applicazione host, dopo il quale può assegnare diversi AppUserModelID a ogni esperienza percepita che ospita. In alternativa, il processo host può consentire al programma ospitato di impostare i relativi Id AppUserModelID. In entrambi i casi, il processo host deve mantenere un record dell'origine degli AppUserModelID, se stesso o l'applicazione ospitata. In questo caso, non esiste alcuna esperienza utente primaria del processo host senza il contenuto di destinazione. Esempi sono applicazioni Windows Remote Applications Integrated Local (RAIL), Java Runtime, RunDLL32.exe o DLLHost.exe.

    Nel caso di applicazioni ospitate esistenti, il sistema tenta di identificare le singole esperienze, ma le nuove applicazioni devono usare AppUserModelID esplicite per garantire l'esperienza utente prevista.

  • I processi cooperativi o concatenati che all'utente fanno parte della stessa applicazione devono avere lo stesso AppUserModelID applicato a ogni processo. Gli esempi includono giochi con un processo di avvio (concatenato) e Microsoft Lettore multimediale Windows, che ha un'esperienza di prima esecuzione/installazione in esecuzione in un processo e l'applicazione principale in esecuzione in un altro processo (cooperativa).

  • Un'estensione dello spazio dei nomi shell che funge da applicazione separata per più di esplorazione e gestione del contenuto in Esplora risorse deve assegnare un AppUserModelID nelle relative proprietà della cartella. Un esempio è il Pannello di controllo.

  • In un ambiente di virtualizzazione, ad esempio un framework di distribuzione, l'ambiente di virtualizzazione deve assegnare diversi AppUserModelID a ogni applicazione gestita. In questi casi, un launcher dell'applicazione usa un processo intermedio per configurare l'ambiente e quindi passa l'operazione a un processo diverso per eseguire l'applicazione. Si noti che ciò causa l'impossibilità del sistema di correlare il processo di destinazione in esecuzione al collegamento perché il collegamento punta al processo intermedio.

    Se qualsiasi applicazione ha più finestre, collegamenti o processi, l'applicazione assegnata a AppUserModelID deve essere applicata anche a ognuna di queste parti dall'ambiente di virtualizzazione.

    Un esempio di questa situazione è il framework ClickOnce, che assegna correttamente AppUserModelIDs per conto delle applicazioni gestite. Come in tutti questi ambienti, le applicazioni distribuite e gestite da ClickOnce non devono assegnare gli stessi AppUserModelID espliciti, perché in questo modo verranno in conflitto con gli AppUserModelID assegnati da ClickOnce e comportano risultati imprevisti.

Come creare un Application-Defined AppUserModelID

Un'applicazione deve specificare appUserModelID nel modulo seguente. Non può contenere più di 128 caratteri e non può contenere spazi. Ogni sezione deve essere pascal-cased.

CompanyName.ProductName.SubProduct.VersionInformation

CompanyNamee deve essere sempre usato, mentre le SubProduct parti e VersionInformation sono facoltative e ProductName dipendono dai requisiti dell'applicazione. SubProduct consente a un'applicazione principale costituita da diverse sottoapplicazioni di fornire un pulsante della barra delle applicazioni separato per ogni sottoapplicazione e le relative finestre associate. VersionInformation consente a due versioni di un'applicazione di coesistenza mentre vengono considerate entità discrete. Se un'applicazione non deve essere usata in questo modo, deve VersionInformation essere omesso in modo che una versione aggiornata possa usare lo stesso AppUserModelID della versione sostituita.

Dove Assegnare un AppUserModelID

Quando un'applicazione usa uno o più AppUserModelID espliciti, deve applicare tali appUserModelID nelle posizioni e nelle situazioni seguenti:

  • Nella proprietà System.AppUserModel.ID del file di scelta rapida dell'applicazione. Un collegamento (come IShellLink, CLSID_ShellLink o un file con estensione lnk) supporta le proprietà tramite IPropertyStore e altri meccanismi di impostazione delle proprietà usati in Shell. Ciò consente alla barra delle applicazioni di identificare il collegamento appropriato per aggiungere e assicurarsi che le finestre appartenenti al processo siano associate in modo appropriato al pulsante della barra delle applicazioni.

    Nota

    La proprietà System.AppUserModel.ID deve essere applicata a un collegamento quando viene creato tale collegamento. Quando si usa Microsoft Windows Installer (MSI) per installare l'applicazione, la tabella MsiShortcutProperty consente di applicare AppUserModelID al collegamento quando viene creato durante l'installazione.

     

  • Come proprietà di una delle finestre in esecuzione dell'applicazione. Questo può essere impostato in uno dei due modi seguenti:

    1. Se diverse finestre di proprietà di un processo richiedono appUserModelID diversi per controllare il raggruppamento della barra delle applicazioni, usare SHGetPropertyStoreForWindow) per recuperare l'archivio delle proprietà della finestra e impostare AppUserModelID come proprietà della finestra.
    2. Se tutte le finestre del processo usano lo stesso AppUserModelID, impostare AppUserModelID nel processo anche se SetCurrentProcessExplicitAppUserModelID. Un'applicazione deve chiamare SetCurrentProcessExplicitAppUserModelID per impostare il relativo AppUserModelID durante la routine di avvio iniziale di un'applicazione prima che l'applicazione presenti qualsiasi interfaccia utente, effettua una manipolazione dei relativi Jump List o effettua (o fa sì che il sistema faccia) qualsiasi chiamata a SHAddToRecentDocs.

    AppUserModelID a livello di finestra esegue l'override di un AppUserModelID a livello di processo.

    Quando un'applicazione imposta un AppUserModelID esplicito a livello di finestra, l'applicazione può fornire le specifiche del relativo comando di riavvio per il pulsante della barra delle applicazioni. Per fornire tali informazioni, vengono usate le proprietà seguenti:

    Nota

    Se esiste un collegamento per avviare l'applicazione, un'applicazione deve applicare AppUserModelID come proprietà del collegamento anziché usare le proprietà di riavvio. In tal caso, la riga di comando, l'icona e il testo del collegamento vengono usati per fornire le stesse informazioni delle proprietà di riavvio.

     

    Un appUserModelID esplicito a livello di finestra può usare anche la proprietà System.AppUserModel.PreventPinning per specificare che non deve essere disponibile per l'aggiunta o il riavvio.

  • In una chiamata per personalizzare o aggiornare (ICustomDestinationList), recuperare (IApplicationDocumentLists) o cancellare (IApplicationDestinations) dell'applicazione Jump List.

  • Nella registrazione dell'associazione di file (tramite il relativo ProgID) se l'applicazione usa automaticamente gli elenchi di destinazione Recenti o Frequenti generati dal sistema. Queste informazioni sull'associazione sono a cui fa riferimento SHAddToRecentDocs. Queste informazioni vengono usate anche quando si aggiungono destinazioni IShellItem a jump list personalizzate tramite ICustomDestinationList::AppendCategory.

  • In qualsiasi chiamata l'applicazione viene eseguita direttamente a SHAddToRecentDocs. Se l'applicazione dipende dalla finestra di dialogo file comune per effettuare chiamate a SHAddToRecentDocs per suo conto, tali chiamate possono dedurre l'AppUserModelID esplicito solo se AppUserModelID è impostato per l'intero processo. Se l'applicazione imposta AppUserModelID nelle finestre anziché sul processo, l'applicazione deve effettuare tutte le chiamate a SHAddToRecentDocs , con il relativo AppUserModelID esplicito, oltre a impedire alla finestra di dialogo file comune di effettuare chiamate personalizzate. Questa operazione deve essere eseguita ogni volta che un elemento viene aperto, per assicurarsi che le sezioni Recenti o Frequenti dell'elenco jump dell'applicazione siano accurate.

Gli elementi seguenti descrivono scenari comuni e dove applicare appUserModelID espliciti in questi scenari.

  • Quando un singolo processo contiene più applicazioni, usare SHGetPropertyStoreForWindow per recuperare l'archivio delle proprietà della finestra e impostare AppUserModelID come proprietà della finestra.
  • Quando un'applicazione usa più processi, applicare AppUserModelID a ogni processo. Se si usa lo stesso AppUserModelID in ogni processo dipende dal fatto che ogni processo venga visualizzato come parte dell'applicazione principale o come singole entità.
  • Per separare determinate finestre da un set nello stesso processo, usare l'archivio delle proprietà della finestra per applicare un singolo AppUserModelID a tali finestre da separare e quindi applicare un AppUserModelID diverso al processo. Qualsiasi finestra in tale processo che non è stata etichettata in modo esplicito con appUserModelID a livello di finestra eredita l'AppUserModelID del processo.
  • Se un tipo di file è associato a un'applicazione, assegnare AppUserModelID nella registrazione ProgID del tipo di file. Se un singolo file eseguibile viene avviato in modalità diverse che appaiono all'utente come applicazioni distinte, è necessario un appUserModelID separato per ogni modalità. In questo caso, è necessario che siano presenti più registrazioni ProgID per il tipo di file, ognuna con un appUserModelID diverso.
  • Quando sono presenti più percorsi di scelta rapida da cui un utente può avviare un'applicazione (nel menu Start , sul desktop o altrove) recuperare l'archivio delle proprietà del collegamento per applicare un singolo AppUserModelID a tutte le scelte rapide come proprietà di scelta rapida.
  • Quando viene effettuata una chiamata esplicita a SHAddToRecentDocs da un'applicazione, usare AppUserModelID nella chiamata. Quando la finestra di dialogo file comune viene usata per aprire o salvare i file, SHAddToRecentDocs viene chiamata dalla finestra di dialogo per conto dell'applicazione. Tale chiamata può dedurre l'appUserModelID esplicito dal processo. Tuttavia, se un AppUserModelID esplicito viene applicato come proprietà di finestra, la finestra di dialogo file comune non può determinare l'appUserModelID corretto. In tal caso, l'applicazione stessa deve chiamare in modo esplicito SHAddToRecentDocs e specificarla con l'AppUserModelID corretto. Inoltre, l'applicazione deve impedire alla finestra di dialogo di file comune di chiamare SHAddToRecentDocs per suo conto impostando il flag di FOS_DONTADDTORECENT nel metodo GetOptions di IFileOpenDialog o IFileSaveDialog.

Registrazione di un'applicazione come processo host

Un'applicazione può impostare la voce del Registro di sistema IsHostApp per causare che il processo eseguibile venga considerato un processo host dalla barra delle applicazioni. Ciò influisce sul raggruppamento e sulle voci di Jump List predefinite.

Nell'esempio seguente viene illustrata la voce del Registro di sistema necessaria. Si noti che la voce non è assegnata a un valore; la sua presenza è tutto ciò che è necessario. È un valore REG_NULL.

HKEY_CLASSES_ROOT
   Applications
      example.exe
         IsHostApp

Se il processo stesso o il file di collegamento usato per avviare il processo ha un AppUserModelID esplicito, l'elenco di processi host viene ignorato e l'applicazione viene considerata come una normale applicazione dalla barra delle applicazioni. Le finestre in esecuzione dell'applicazione vengono raggruppate in un singolo pulsante della barra delle applicazioni e l'applicazione può essere aggiunta alla barra delle applicazioni.

Se solo il nome eseguibile del processo in esecuzione è noto, senza un appUserModelID esplicito e tale eseguibile si trova nell'elenco dei processi host, ogni istanza del processo viene considerata come un'entità separata per il raggruppamento della barra delle applicazioni. Il pulsante della barra delle applicazioni associato a qualsiasi istanza specifica del processo non visualizza un'opzione pin/unpin o un'icona di avvio per una nuova istanza del processo. Il processo non è idoneo anche per l'inclusione nell'elenco MFU (Most Frequently Used) del menu Start . Tuttavia, se il processo è stato avviato tramite un collegamento che contiene argomenti di avvio (in genere il contenuto di destinazione da ospitare come "applicazione"), il sistema può determinare l'identità e l'applicazione può essere aggiunta e riavviata.

Elenchi di esclusione per l'aggiunta della barra delle applicazioni e elenchi recenti/frequenti

Le applicazioni, i processi e le finestre possono scegliere di non essere disponibili per l'aggiunta alla barra delle applicazioni o per l'inclusione nell'elenco MFU del menu Start . Sono disponibili tre meccanismi per eseguire questa operazione:

  1. Aggiungere la voce NoStartPage alla registrazione dell'applicazione, come illustrato di seguito:

    HKEY_CLASSES_ROOT
       Applications
          Example.exe
             NoStartPage
    

    I dati associati alla voce NoStartPage vengono ignorati. È necessaria solo la presenza della voce. Pertanto, il tipo ideale per NoStartPage è REG_NONE.

    Si noti che qualsiasi uso di appUserModelID esplicito esegue l'override della voce NoStartPage. Se un appUserModelID esplicito viene applicato a un collegamento, a un processo o a una finestra, diventa pinnable e idoneo per l'elenco MFU del menu Start .

  2. Impostare la proprietà System.AppUserModel.PreventPinning in finestre e collegamenti. Questa proprietà deve essere impostata su una finestra prima della proprietà PKEY_AppUserModel_ID .

  3. Aggiungere un appUserModelID esplicito come valore nella sottochiave del Registro di sistema seguente, come illustrato di seguito:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      FileAssociation
                         NoStartPageAppUserModelIDs
                            AppUserModelID1
                            AppUserModelID2
                            AppUserModelID3
    

    Ogni voce è un valore REG_NULL con il nome di AppUserModelID. Qualsiasi AppUserModelID trovato in questo elenco non è pinnable e non è idoneo per l'inclusione nell'elenco MFU del menu Start .

Tenere presente che alcuni file eseguibili e collegamenti che contengono determinate stringhe nel nome vengono esclusi automaticamente dall'aggiunta e dall'inclusione nell'elenco MFU.

Nota

Questa esclusione automatica può essere sostituita applicando un AppUserModelID esplicito.

 

Se una delle stringhe seguenti, indipendentemente dal caso, viene inclusa nel nome del collegamento, il programma non è pinnable e non viene visualizzato nell'elenco usato più frequentemente (non applicabile a Windows 10):

  • Documentazione
  • Help
  • Installazione
  • Altre informazioni
  • Leggimi
  • Lettura prima
  • File Leggimi
  • Rimuovi
  • Installazione
  • Supporto
  • Novità

L'elenco seguente di programmi non è pinnable e viene escluso dall'elenco più frequente.

  • Applaunch.exe
  • Control.exe
  • Dfsvc.exe
  • Dllhost.exe
  • Guestmodemsg.exe
  • Hh.exe
  • Install.exe
  • Isuninst.exe
  • Lnkstub.exe
  • Mmc.exe
  • Mshta.exe
  • Msiexec.exe
  • Msoobe.exe
  • Rundll32.exe
  • Setup.exe
  • St5unst.exe
  • Unwise.exe
  • Unwise32.exe
  • Werfault.exe
  • Winhlp32.exe
  • Wlrmdr.exe
  • Wuapp.exe

Gli elenchi precedenti vengono archiviati nei valori del Registro di sistema seguenti.

Nota

Questi elenchi non devono essere modificati dalle applicazioni. Usare uno dei metodi di elenco di esclusione elencati in precedenza per la stessa esperienza.

 

HKEY_LOCAL_MACHINE
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  FileAssociation
                     AddRemoveApps
                     HostApps

SetCurrentProcessExplicitAppUserModelID

GetCurrentProcessExplicitAppUserModelID

Estensioni della barra delle applicazioni

ICustomDestinationList::SetAppID

IApplicationDocumentLists::SetAppID

IApplicationDestinations::SetAppID

SHGetPropertyStoreForWindow