1

こんにちは私はプリンターのプロパティを取得するためにこのコードを持っています:

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

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection coll = searcher.Get();

foreach (ManagementObject printer in coll)
{
    foreach (PropertyData property in printer.Properties)
    {
          Console.WriteLine(string.Format("{0}: {1}", 
                                          property.Name, 
                                          property.Value));
    }
}

しかし、私が必要とするプロパティは常に同じものを返します:

PrinterState:0

PrinterStatus:3

基本的に、プリンターの用紙がなくなっているかどうかを確認するためにこれが必要です。私が思うこと:PrinterState:4

wxp-86とw7-64でテストすると、同じ.Net4.0が返されます

ありがとうございました。

4

4 に答える 4

3

私にもこの問題があり、これを簡単に修正することはできません。

この問題の原因は、Windows Management Instrumentation(WMI)がspoolsv.exeプロセスからプリンター情報を取得することです。したがって、取得される情報の信頼性は、プリンタドライバに完全に依存します。情報を照会しているプリンターのドライバーが、ステータスを取得するためにスプーラーをバイパスしているか、スプーラープロセスにステータスを報告していない可能性があります。

Win32_Printerは、スプーラに含まれているステータスを報告します。したがって、スプーラがReadyを報告した場合、デフォルトはReadyであるため、ステータスが変更されたデータを受信することはありません。Win32_Printerは、これをIdle(PrinterStatus=3またはPrinterState=0) としてエクスポートするだけです。

于 2013-08-13T16:49:39.913 に答える
1

msdnによると、Paper Out = 5

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                string printerName = "PrinterName";
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT * FROM Win32_Printer "
                     + "WHERE Name LIKE '%{0}'", printerName);); 

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_Printer instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("PrinterStatus: {0}", queryObj["PrinterStatus"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}
于 2013-01-22T10:29:20.153 に答える
0

この行:

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

printernameの後に%を付けて呼び出してみてください。

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

多くの場合、プリンタ名は「[printername]On[port]」です。

于 2013-01-22T10:15:57.627 に答える
0

さらに、拡張プリンタのステータスと別のプロパティを確認できます。有線プリンターは、ワイヤレスプリンター(LAN、WLan、Bluetooth)よりも多くの情報を提供できます。

https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-printer

using System;
using System.Management;
using System.Windows.Forms;

namespace PrinterSet
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            QueryOnWMI();
        }

        private void QueryOnWMI()
        {
            try
            {
                // Common Information Model v2 (namespace)
                string scope = @"root\CIMV2";
                string printerName = printerNameTextBox.Text.Trim();
                //printerName = "%DocuCentre%";
                string query = "SELECT * FROM Win32_Printer";
                if (!string.IsNullOrEmpty(printerName))
                {
                    query += $" WHERE Name Like '%{printerName}%'";
                }
                Console.Clear();
                var searcher = new ManagementObjectSearcher(scope, query);
                var result = searcher.Get();
                if (result == null || result.Count == 0)
                {
                    Console.WriteLine($"Printer '{printerName}' not found");
                }
                var line = new string('-', 40);
                foreach (ManagementObject queryObj in result)
                {
                    Console.WriteLine(line);
                    Console.WriteLine($"Printer : {queryObj["Name"]}");
                    ushort ps = Convert.ToUInt16(queryObj["PrinterStatus"]);
                    var psEnum = (PrinterStatus)ps;
                    Console.WriteLine("PrinterStatus: {0} ({1})", psEnum, ps);
                    ps = Convert.ToUInt16(queryObj["ExtendedPrinterStatus"]);
                    var psExtended = (ExtendedPrinterStatus)ps;
                    Console.WriteLine("Extended Status: {0} ({1})", psExtended, ps);
                    //var papers = (string[])queryObj["PrinterPaperNames"];
                    //foreach (var paper in papers)
                    //{
                    //    Console.WriteLine("Paper Name: {0}", paper);
                    //}
                    Console.WriteLine(line);
                }
            }
            catch (ManagementException emx)
            {
                // TRY => NET STOP SPOOLER
                // Generic failure is thrown 
                MessageBox.Show(this, "Invalid query: " + emx.Message);
            }
        }

        public enum PrinterStatus : UInt16
        {
            Other = 1, Unknown = 2, Idle = 3, Printing= 4, Warmup = 5, StoppedPrinting = 6, Offline = 7, 
        }

        public enum ExtendedPrinterStatus : UInt16
        {
            Other = 1, Unknown = 2, Idle = 3, Printing, WarmingUp, StoppedPrinting, Offline, Paused, Error, 
            Busy, NotAvailable, Waiting, Processing, Initialization, PowerSave, PendingDeletion, IOActive, ManualFeed

        }

        private void button1_Click(object sender, EventArgs e)
        {
            QueryOnWMI();
        }
    }
}

WindowsスプーラーAPIを調べることもできます: https ://docs.microsoft.com/en-us/windows-hardware/drivers/print/introduction-to-spooler-components

そしてこれ: windows-printer-driver @ stackoverflow

アントニオ

于 2020-09-01T02:55:05.347 に答える