как распечатать тестовую страницу на принтере? - PullRequest
0 голосов
/ 31 января 2019

Я новичок в C# и использую формы Windows, Windows 7 и .Net 4.0.К моему компьютеру подключено 3 принтера. Я хочу напечатать тестовую страницу Windows на определенном принтереВсе имена принтеров перечислены в ComboBox, как показано в следующем коде. Я хочу выбрать принтер из ComboBox и распечатать тестовую страницу.

Я посмотрел Здесь , Здесь и Здесь но ничего не помогло.

Кто-нибудь знает, как это сделать?

foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    comboBox_Printers.Items.Add(printer);
}

1 Ответ

0 голосов
/ 01 февраля 2019

Теперь этот метод может выглядеть многословно , но я думаю, что при вызове WMI методов важно, чтобы параметры управления и области действия были определены правильно.
Это дает возможность исправлять / адаптироватькод для определенных контекстов, когда это необходимо.
Кроме того, вспомогательные методы здесь могут быть повторно использованы для инициализации любого другого WMI запроса.

Например, неправильная опция Impersonation приведет к исключению (0x80070005: (E_ACCESSDENIED)) при подключении к WMI Scope или когда запрос WMIказнены.

Описание параметров метода PrintTestPage:

string PrinterName: имя определенного принтера или null для использованияПринтер по умолчанию.
string MachineName: имя машины в сети или null для использования имени LocalMachine.

Метод возвращает 0 в случае успеха и выдает исключение, если принтер не найден.

Пример вызова для печати пробной страницы с использованием принтера по умолчанию на локальном компьютере:

var result = PrintTestPage(null, null);

using System.Linq;
using System.Management;

public static uint PrintTestPage(string PrinterName, string MachineName)
{
    ConnectionOptions connOptions = GetConnectionOptions();
    EnumerationOptions mOptions = GetEnumerationOptions(false);
    string machineName = string.IsNullOrEmpty(MachineName) ? Environment.MachineName : MachineName;
    ManagementScope mScope = new ManagementScope($@"\\{machineName}\root\CIMV2", connOptions);
    SelectQuery mQuery = new SelectQuery("SELECT * FROM Win32_Printer");
    mQuery.QueryString += string.IsNullOrEmpty(PrinterName) 
                        ? " WHERE Default = True" 
                        : $" WHERE Name = '{PrinterName}'";
    mScope.Connect();

    using (ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(mScope, mQuery, mOptions))
    {
        ManagementObject moPrinter = moSearcher.Get().OfType<ManagementObject>().FirstOrDefault();
        if (moPrinter is null) throw new InvalidOperationException("Printer not found");

        InvokeMethodOptions moMethodOpt = new InvokeMethodOptions(null, ManagementOptions.InfiniteTimeout);
        using (ManagementBaseObject moParams = moPrinter.GetMethodParameters("PrintTestPage"))
        using (ManagementBaseObject moResult = moPrinter.InvokeMethod("PrintTestPage", moParams, moMethodOpt))
            return (UInt32)moResult["ReturnValue"];
    }
}

Вспомогательные методы:

private static EnumerationOptions GetEnumerationOptions(bool DeepScan)
{
    EnumerationOptions mOptions = new EnumerationOptions()
    {
        Rewindable = false,        //Forward only query => no caching
        ReturnImmediately = true,  //Pseudo-async result
        DirectRead = true,         //Skip superclasses
        EnumerateDeep = DeepScan   //No recursion
    };
    return mOptions;
}

private static ConnectionOptions GetConnectionOptions()
{
    ConnectionOptions connOptions = new ConnectionOptions()
    {
        EnablePrivileges = true,
        Timeout = ManagementOptions.InfiniteTimeout,
        Authentication = AuthenticationLevel.PacketPrivacy,
        Impersonation = ImpersonationLevel.Impersonate
    };
    return connOptions;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...