2010-02-24 8 views
8

Ich habe eine Liste aller in WinXP verfügbaren Drucker. Ich brauche den Code (idealerweise .NET), um alle virtuellen Drucker aus dieser Liste herauszufiltern. Ist es möglich zu tun? Ich habe alle Eigenschaften der Klasse Win32_Printer wmi analysiert, kann aber keine geeignete Klasse erkennen. Bitte helfen Sie.Gibt es eine Möglichkeit, virtuelle Drucker von physischen zu unterscheiden?

+0

Aus Neugier, warum müssen Sie das tun? –

Antwort

4

Ich glaube nicht, dass es möglich ist, zumindest mit Sicherheit. Der Sinn eines virtuellen Druckers besteht darin, einen echten so genau wie möglich zu imitieren, so dass alle Unterschiede, die Sie erkennen können, im Grunde nur Fehler im virtuellen Drucker sind.

Das heißt, Sie können einige Vermutungen basierend auf der PortName machen. Nur für ein paar Beispiele, eine PortName, die eine IP-Adresse enthält oder mit "USB" beginnt, bezieht sich wahrscheinlich auf eine physische Verbindung.

+0

Große Antwort, Jerry. Zog einige Beispiele und fand es nicht möglich. Bezüglich Ihres Tippvorschlags gibt es eine Einschränkung: Faxe. Einer unserer PC's hat einen Direktverbindungs-Fax/Drucker, wobei jeder als ein separater Drucker aufgelistet ist (z.B. HPFAX1, USB001). Das integrierte MS Fax wird jedoch als SHRFAX aufgelistet. Ich kann mir vorstellen, dass andere virtuelle Faxe ähnlich aufgelistet werden. Auch das Finden dieser Informationen ohne Verwendung von WMI ist aus den Recherchen, die ich durchgeführt habe, möglicherweise nicht möglich. – Lizz

3

Ich weiß, das ist eine alte Frage, aber diese Antwort kann für jemanden mit dem gleichen Problem hilfreich sein.

Wenn mein Verständnis eines "virtuellen Druckers" korrekt ist. Sie könnten die WMI-Eigenschaft "PrintProcessor" überprüfen und "winprint" ignorieren. Nach meinem Wissen ignoriert dies alle Windows 7-Software-basierten Druckeroptionen. Hier ist ein Beispielcode, um das zu demonstrieren. Gibt den Druckernamen zurück.

 using System.Management; 

     try 
     { 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Printer"); 

      foreach (ManagementObject obj in searcher.Get()) 
      { 
       if(obj != null) 
       { 
        if(obj["PrintProcessor"].ToString().ToUpper() != "WINPRINT") 
        { 
         Console.WriteLine(obj["Name"]); 
        } 
       } 
      } 
     } 
     catch (ManagementException e) 
     { 
      MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
     } 
Verwandte Themen