2012-08-24 12 views
6

Ecco quello che stiamo cercando di fare:stampante di impostazione "KeepPrintedDocuments" proprietà in .NET

Vogliamo un modo discreto di prendere tutto ciò che un client stampe sul proprio computer (tutti i nostri clienti sono in esecuzione sistemi POS e l'uso Windows XP in esclusiva) e inviarlo a noi, e abbiamo deciso che il modo migliore per farlo è quello di creare l'app aC# che ci invia i file di spooling, che possiamo già analizzare facilmente.

Tuttavia, ciò richiede l'impostazione "Mantieni tutti i documenti stampati" su true. Vogliamo farlo nella nostra app piuttosto che manualmente, per il seguente motivo: alcuni (centinaia) dei nostri clienti sono, per mancanza di una parola migliore, stupidi. Non vogliamo costringerli a fare confusione nel pannello di controllo ... le nostre persone di supporto tecnico sono abbastanza impegnate.

qui è dove ho incontrato un problema:

string searchQuery = "SELECT * FROM Win32_Printer"; 
ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery); 
ManagementObjectCollection printerCollection = searchPrinters.Get(); 


foreach (ManagementObject printer in printerCollection) 
{ 
    PropertyDataCollection printerProperties = printer.Properties; 
    foreach (PropertyData property in printerProperties) 
    { 
     if (property.Name == "KeepPrintedJobs") 
     { 
      printerProperties[property.Name].Value = true; 
     } 
    } 
} 

Questo dovrebbe, per quanto posso dire da diverse ore di ricerca WMI, impostare la proprietà KeepPrintedJobs di ogni stampante di vero ... ma la sua non funziona. Non appena termina il ciclo foreach, KeepPrintedJobs viene impostato su false. Preferiremmo usare WMI e non fare casino nel registro, ma non posso spendere per sempre cercando di farlo funzionare. Qualche idea su cosa manca?

+0

Qualcuno sa qualcosa di questo? Abbiamo proceduto con una piccola modifica al registro, ma vorremmo sapere se è possibile. –

+1

Hai visto questo: http://msdn.microsoft.com/en-us/library/w09tfy94.aspx? Mi sembra che tu debba chiamare uno degli overload di 'Put()' per impegnare esplicitamente il/i cambiamento/i. –

+0

* Schiaffi sulla fronte * sciocco, naturalmente, grazie amico. Gli hack Reg si sentono sporchi. –

risposta

3

Prova ad aggiungere una chiamata al Put() sul ManagementObject a persistere in modo esplicito il cambiamento, in questo modo:

foreach (ManagementObject printer in printerCollection) 
{ 
    PropertyDataCollection printerProperties = printer.Properties; 
    foreach (PropertyData property in printerProperties) 
    { 
     if (property.Name == "KeepPrintedJobs") 
     { 
      printerProperties[property.Name].Value = true; 
     } 
    } 
    printer.Put(); 
} 

Speranza che aiuta.

+0

Abbiamo già rilasciato ai nostri clienti XP, molti dei quali usano XPe, quindi avremmo dovuto utilizzare comunque il metodo di registro in quanto dovevamo scegliere come target versioni .NET precedenti. Tuttavia questo ci sarà utile nel prossimo futuro, quindi grazie! –

Problemi correlati