2013-04-12 8 views
6

Ho una funzione Help nel mio Application, che consiste in uno webbrowser control. Che webbrowser control venga riempito con uno .pdf file, la fonte di quello .pdf file è il nostro sito Web.Controllare se è installato un qualsiasi lettore PDF

Il problema è che non tutti avranno un PDF Reader installato sulla propria macchina, quindi voglio controllare se uno è installato: Sì o No. Ho cercato su internet e ho visto che la maggior parte degli utenti su StackOverflow dove vogliono controllare se è stato installato Adobe Reader, non è quello che voglio. Devo sapere se c'è un PDF Reader installato da qualche parte sulla macchina.

ho trovato il seguente codice, che può forse aiutarmi:

public void CheckPdfReaderAvailable()  
{  
    RegistryKey key = Registry.ClassesRoot.OpenSubKey(".pdf");  
    Assert.IsNotNull(key);  
} 

Mentre guardo il codice di cui sopra, i miei pensieri sono che il codice verifica se il registry sa il .pdf format, ma io' non sono sicuro.

Qualcuno può dirmi come usare il codice qui sopra o fornirmi un esempio su come dovrei risolvere questo problema?

Grazie in anticipo!

EDIT:

La risposta seguente aiutato mio out: https://stackoverflow.com/a/774482/1661209

Un altro modo per risolvere questo problema, è quello di aggiungere una lite PDF Reader ai prerequisiti e rendere gli utenti installano che prima, si non c'è bisogno di controllare un lettore di PDF, perché sai che è installato, quindi, se non lo si può dire, è l'errore dell'utente che non possono usare la funzione di aiuto, perché gli hai offerto un modo installare facilmente il lettore pdf usando il progetto pubblicato.

+0

Perché non hanno HTML in un controllo WebBrowser? Perché non basta lanciare il PDF all'utente e lasciare che si occupino di esso? Cosa fai se non hanno installato un visualizzatore di PDF? –

+0

Questo è il mio problema qui, voglio verificare se un utente ha installato un visualizzatore PDF: Sì o No, altrimenti fornirò loro un link per il download, in modo che possano comunque utilizzare la mia funzione di aiuto. – Max

+0

Controlla questa risposta forse può aiutarti o aprire un percorso per te [http: // stackoverflow.com/domande/6086973/how-can-i-programmazione-check-file-che-un-file-associazione-esiste-prima-atte/6.087.057 # 6.087.057] [1] [1]: http : //stackoverflow.com/questions/6086973/how-can-i-programmatically-check-file-that-a-file-association-exists-before-atte/6087057#6087057 –

risposta

5

parte se è utile sapere o no, si poteva probabile controllare la seguente chiave di registro:

HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdf

Ciò avrà una voce CLSID, che punta alla classe ID dell'applicazione predefinita .

Se la chiave di registro o il valore CLSID non è presente, il tipo MIME è sconosciuto o non esiste alcuna applicazione predefinita per gestire i file MIME di tipo application/pdf.

+0

Come utilizzare questa linea nel C# per il controllo? –

+0

vedere la mia risposta sotto –

+0

Questo approccio ha una presa, però: Windows 10 viene fornito con Edge che apre PDF per impostazione predefinita (a patto che non si disponga di una versione N di Windows 10, in cui semplicemente non funziona). Edge non è registrato come CLSID per applicazione/pdf –

2

È possibile interrogare direttamente il registro, ma la soluzione consigliata è utilizzare l'interfaccia IQueryAssociations per verificare se è presente un programma registrato per aprire i file PDF. Un esempio può essere trovato su pinvoke.net.

0

C# attuazione dell'approccio suggerito da John Willemse (non riconoscerà Edge come visualizzatore predefinito sulla non-N versione di Windows 10):

private bool CanOpenPDFFiles 
    { 
     get 
     { 
      bool CLSIDpresent = false; 

      try 
      { 
       using (Microsoft.Win32.RegistryKey applicationPDF = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type\application/pdf")) 
       { 
        if (applicationPDF != null) 
        { 
         var CLSID = applicationPDF.GetValue("CLSID"); 
         if (CLSID != null) 
         { 
          CLSIDpresent = true; 
         } 
        } 
       } 
      } 
      catch (Exception) 
      { 

      } 

      return CLSIDpresent; 
     } 
    } 
Problemi correlati