سؤال

توجد في PrintDialog القياسي أربع قيم مرتبطة بالطابعة المحددة:الحالة والنوع والمكان والتعليق.

إذا كنت أعرف اسم الطابعة، فكيف يمكنني الحصول على هذه القيم في C# 2.0؟

هل كانت مفيدة؟

المحلول

dowski اقترح ، يمكنك استخدام WMI ل الحصول على خصائص الطابعة. يعرض التعليمة البرمجية التالية عن خصائص اسم طابعة معينة. بين لهم أنك سوف تجد: PrinterStatus، تعليق، الموقع، DriverName، PortName، الخ

using System.Management;

...

string printerName = "YourPrinterName";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
using (ManagementObjectCollection coll = searcher.Get())
{
    try
    {
        foreach (ManagementObject printer in coll)
        {
            foreach (PropertyData property in printer.Properties)
            {
                Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
            }
        }
    }
    catch (ManagementException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

نصائح أخرى

هذا يجب عمل.

using System.Drawing.Printing;

...

PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting

وبعد ذلك المختلفة ملكيات يمكن قراءة إعدادات الطابعة.

لاحظ أن ps.isValid() يمكن معرفة ما إذا كانت الطابعة موجودة بالفعل.

يحرر:تعليق إضافي واحد.توصي Microsoft باستخدام طباعة المستند وتعديل إعدادات الطابعة الخاصة بها بدلاً من إنشاء إعدادات الطابعة مباشرةً.

يرجى ملاحظة أن المادة التي دوسكي و بانوس كان يشير إلى (MSDN Win32_Printer) يمكن أن يكون مضللاً بعض الشيء.

أنا أشير إلى القيمة الأولى لمعظم المصفوفات.بعضها يبدأ بـ 1 والبعض يبدأ بـ 0.على سبيل المثال، "ExtendedPrinterStatus"القيمة الأولى في الجدول هي 1، لذلك يجب أن تكون المصفوفة كما يلي:

string[] arrExtendedPrinterStatus = { 
    "","Other", "Unknown", "Idle", "Printing", "Warming Up",
    "Stopped Printing", "Offline", "Paused", "Error", "Busy",
    "Not Available", "Waiting", "Processing", "Initialization",
    "Power Save", "Pending Deletion", "I/O Active", "Manual Feed"
};

ومن ناحية أخرى "حالة الخطأ"القيمة الأولى في الجدول هي 0، لذلك يجب أن تكون المصفوفة كما يلي:

string[] arrErrorState = {
    "Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
    "No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
    "Output Bin Full"
};

راجع للشغل, "حالة الطابعة"قد عفا عليه الزمن، ولكن يمكنك استخدامه"حالة الطابعة".

وفقط للرجوع اليها، هنا هو قائمة بجميع الخصائص المتوفرة لManagementObject الطابعة.

usage: printer.Properties["PropName"].Value

ولقد مضى وقت طويل منذ أن كنت قد عملت في بيئة ويندوز، ولكن أود أن أقترح عليك أن ننظر إلى <لأ href = "http://msdn.microsoft.com/en-us/library/aa394363.aspx "يختلط =" noreferrer نوفولو "> باستخدام WMI .

وأنا أعلم أنه لنشر القديمة، ولكن في الوقت الحاضر أسهل / الخيار الاسرع هو استخدام خدمات الطباعة المحسنة التي يوفرها الإطار WPF (للاستخدام بواسطة التطبيقات غير WPF).

http://msdn.microsoft كوم / EN-US / مكتبة / System.Printing (ت = vs.110) .aspx اتصال

مثال لاسترداد وضع قائمة انتظار الطابعة والمهمة الأولى ..

var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus

وكبديل لWMI يمكنك الحصول على نتائج سريعة دقيقة عن طريق التنصت في لWinSpool.drv (أي ويندوز API) - يمكنك الحصول على كافة التفاصيل على واجهات البنيات والثوابت من pinvoke.net، أو لقد وضعت رمز معا في http://delradiesdev.blogspot.com /2012/02/accessing-printer-status-using-winspool.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top