2010-11-25 8 views
3

Je travaille sur une application Winforms qui permet aux utilisateurs d'imprimer plusieurs rapports Reporting Services différents. Malheureusement, si l'utilisateur essaie d'imprimer au format PDF à l'aide de l'imprimante Adobe PDF, il se bloque. Nous n'avons pas été en mesure de résoudre ce problème, de sorte que nous souhaitons supprimer la possibilité pour les utilisateurs d'imprimer sur l'imprimante Adobe PDF.Comment puis-je supprimer une imprimante de la boîte de dialogue d'impression .Net?

Est-il possible de supprimer par programme l'imprimante Adobe PDF de la liste des imprimantes dans la boîte de dialogue d'impression?

+0

Pouvez-vous détecter le nom/type de l'imprimante après qu'ils l'ont choisi et afficher une boîte de dialogue à ce moment-là pour leur demander de choisir autre chose? – Gabe

+0

Nous utilisons la méthode PrintDialog() sur le contrôle ReportViewer. Une exception est levée dans la méthode PrintDialog() lorsque l'imprimante PDF est sélectionnée. Nous pourrions attraper l'exception et lancer une boîte de dialogue, mais il serait bien plus agréable de supprimer l'option tous ensemble. – JChristian

Répondre

2

Appelez ce avec le nom de l'imprimante avant d'appeler PrintDialog() .... Je pense que cela résoudra votre problème

public bool RemovePrinter(string printerName) 
{ 
     ManagementScope scope = new ManagementScope(ManagementPath.DefaultPath); 
     scope.Connect(); 
     SelectQuery query = new SelectQuery("select * from Win32_Printer"); 
     ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query); 
     ManagementObjectCollection printers = search.Get(); 
     foreach (ManagementObject printer in printers) 
     { 
      string printerName = printer["Name"].ToString().ToLower(); 

      if (printerName.Equals(printerName.ToLower())) 
      { 
       printer.Delete(); 
       break; 
      } 
     }      

     return true; 
} 
+5

Attendez - cela semble être la désinstallation de l'imprimante pour l'ensemble du système, pas seulement pour le programme. Ou est-ce que je manque quelque chose? – Justin

+1

Je ne sais pas pourquoi cela fait baisser les votes. C'est un peu utile de code et non seulement cela fonctionne, il m'a aidé. –

+0

Je me suis surpassé. La première chose que j'ai trouvée, et c'est exactement ce dont j'avais besoin. Je vais développer un peu dans une réponse alternative. –

0

La réponse de Manish m'a donné ce que je avais besoin. Dans mon cas, j'avais un pilote d'imprimante virtuel qui était créé par une bibliothèque, et il a laissé des orphelins comme Printer (1), Printer (2), etc. Je voulais supprimer tous ceux-là, donc j'ai utilisé une variante du Code WMI ci-dessus.

using System.Management; 
//... 
var scope = new ManagementScope(ManagementPath.DefaultPath); 
scope.Connect(); 
var query = new SelectQuery([email protected]"select * from Win32_Printer where Name like '{PrinterDeviceName}%'"); 
foreach (var o in new ManagementObjectSearcher(scope, query).Get()) 
    ((ManagementObject) o).Delete(); 

Vous avez besoin d'une référence à System.Management.