2012-08-24 25 views
6

Đây là những gì chúng tôi đang cố gắng để làm:Setting máy in "KeepPrintedDocuments" bất động sản trong .NET

Chúng tôi muốn một cách kín đáo lấy tất cả mọi thứ một khách hàng in trên máy tính của họ (tất cả khách hàng của chúng tôi đang chạy hệ thống POS và sử dụng Windows XP độc quyền) và gửi nó cho chúng tôi, và chúng tôi đã quyết định cách tốt nhất để làm điều đó là tạo ứng dụng aC# gửi cho chúng tôi các tệp spool của chúng, chúng tôi có thể phân tích cú pháp dễ dàng.

Tuy nhiên, điều này yêu cầu đặt "Giữ tất cả tài liệu in" thành true. Chúng tôi muốn làm điều này trong ứng dụng của chúng tôi chứ không phải bằng tay, vì lý do sau: một số (hàng trăm) khách hàng của chúng tôi, vì thiếu từ tốt hơn, câm. Chúng tôi không muốn ép họ phải làm lộn xộn trong bảng điều khiển ... những người hỗ trợ kỹ thuật của chúng tôi đang bận rộn đủ.

Dưới đây là nơi tôi đã chạy vào một vấn đề:

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; 
     } 
    } 
} 

này nên, như xa như tôi có thể nói từ vài giờ nghiên cứu WMI, thiết lập thuộc tính của mỗi máy in true KeepPrintedJobs ... nhưng nó không hoạt động. Ngay khi vòng lặp foreach kết thúc, KeepPrintedJobs được đặt trở về false. Chúng tôi muốn sử dụng WMI và không lộn xộn xung quanh trong registry, nhưng tôi không thể chi tiêu mãi mãi cố gắng để làm cho công việc này. Bất kỳ ý tưởng về những gì còn thiếu?

+0

Bất cứ ai biết gì về điều này? Chúng tôi đã đi trước với một hack registry nhỏ thay vào đó, nhưng chúng tôi vẫn muốn biết nếu điều này là tất cả có thể. –

+1

Bạn đã thấy điều này: http://msdn.microsoft.com/en-us/library/w09tfy94.aspx? Có vẻ như tôi phải gọi một trong những quá tải của 'Put()' để thực hiện một cách rõ ràng (các) thay đổi. –

+0

* Trán trán * ngu ngốc, tất nhiên, cảm ơn con người. Reg hacks cảm thấy bẩn. –

Trả lời

3

Hãy thử thêm một cuộc gọi đến Put() trên ManagementObject để tồn tại một cách rõ ràng sự thay đổi, như thế này:

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(); 
} 

Hy vọng rằng sẽ giúp.

+0

Chúng tôi đã phát hành cho khách hàng XP của chúng tôi, rất nhiều người trong số họ sử dụng XPe, vì vậy chúng tôi sẽ phải sử dụng phương pháp đăng ký như chúng tôi cần phải nhắm mục tiêu phiên bản .NET trước đó. Tuy nhiên điều này sẽ hữu ích cho chúng tôi trong tương lai gần, vì vậy cảm ơn! –

Các vấn đề liên quan