2013-04-09 7 views
15

I enumerating printerers connected in the PC. L'ho fatto usando lo spazio dei nomi C# System.Printing. Funziona bene. Ma per lo più mostra stampanti software come Microsoft XPS Document writer, Microsoft Fax ecc. Mi piacerebbe sapere che è possibile rimuovere queste stampanti ssoftware dall'enumerazione. Il codice che ho fatto è sotto mostrano:Identifica la stampante originale

PrintQueue printQueue = null; 

LocalPrintServer localPrintServer = new LocalPrintServer(); 

// Retrieving collection of local printer on user machine 
PrintQueueCollection localPrinterCollection = 
    localPrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, 
              EnumeratedPrintQueueTypes.Connections }); 

System.Collections.IEnumerator localPrinterEnumerator = 
    localPrinterCollection.GetEnumerator(); 

while (localPrinterEnumerator.MoveNext()) 
{ 
    // Get PrintQueue from first available printer 
    printQueue = (PrintQueue)localPrinterEnumerator.Current; 

    if (!printQueue.IsOffline) 
    { 
     MessageBox.Show(printQueue.FullName.ToString()); 
     string s = "Printer found " + printQueue.FullName.ToString(); 
     listBox1.Items.Add(s); 
    } 
    else 
    { 
     // No printer exist, return null PrintTicket 
     // return null; 
    } 
} 

risposta

6

L'unico modo che ho trovato è quello di confrontare il nome della stampante desiderata con quello che stiamo ottenendo.

12

La chiave per distinguere una stampante vera e propria da una stampante virtuale è la porta la stampante utilizza. Le stampanti reali utilizzano porte hardware come LPT1: o porte USB. Le stampanti virtuali utilizzano porte basate su software.

La complicazione saranno le stampanti di rete. Non sarà facile determinare se una stampante di rete sta utilizzando una porta hardware.

So che questa non è una buona risposta, ma hai posto una domanda molto difficile. Spero che abbiate iniziato nella giusta direzione.

+0

La cosa molto divertente è che sto usando la stampante di rete :) – Zigma

+1

Ho dato un sacco di pensiero negli ultimi giorni, e penso di conoscere il sottosistema di stampa di Windows così come nessuno al di fuori di Microsoft, e ... beh, temo di non pensare che ci sia un modo per distinguere in modo affidabile tra un hardware e una stampante virtuale in tutti i casi. Potrei darti una soluzione "di solito giusta", ma non credo sia possibile una soluzione "sempre giusta". Scusate. :-( –

3

alcune osservazioni:

  1. Nella finestra Properties la Device Settings pagina è disponibile solo per le stampanti reali e non per le stampanti virtuali. E molti di questi valori sono disponibili in printQueue.UserPrintTicket proprietà

  2. printQueue.QueuePort.Name contiene un indirizzo IP aggiunto con o senza il nome della porta. es: "20.120.12.22_1" o "20.120.12.22" per stampanti veri

enter image description here

+0

Il driver di stampa e il monitor della porta controllano entrambe queste cose e possono fare ciò che desiderano.Posso mostrarti esempi che non corrispondono ai tuoi risultati. –

+0

@CareyGregory: Verificherà che ... Grazie! –

+0

Questo è sbagliato. le stampanti software hanno anche porte con esse – Zigma