Как я могу проверить, есть ли принтер по умолчанию (Windows)? - PullRequest
4 голосов
/ 13 августа 2010

Существует ли API или раздел реестра, который я могу использовать в приложениях (нативном, Java или .Net), чтобы проверить, настроил ли пользователь, вошедший в данный момент, принтер по умолчанию?ответы пока что!Согласно статье базы знаний http://support.microsoft.com/kb/156212, запись реестра (чтение / запись) документирована только до Windows 2000. Существует ли в более новых версиях метод Win API для собственного доступа?

Ответы [ 3 ]

3 голосов
/ 13 августа 2010

Существует API Java для получения принтера по умолчанию:

PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();

Возвращает null, если нет принтера или службы по умолчанию. Это можно использовать в качестве теста.


Старый ответ

Информацию можно найти в реестре. Вы не можете получить доступ к реестру с простой Java, но есть решения JNDI для этой проблемы. Таким образом, в основном вы должны проверить, существует ли определенный ключ в реестре. И, в качестве бонуса, если вы зашли так далеко, вы даже сможете получить имя принтера по умолчанию:)

Дополнительная литература:

3 голосов
/ 13 августа 2010

В неуправляемом API диспетчера очереди печати есть функция winspool.drv.Вы можете вызвать функцию GetDefaultPrinter, чтобы вернуть имя принтера по умолчанию.

Это подпись P / Invoke для неуправляемой функции:

[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
private static extern bool GetDefaultPrinter(
    StringBuilder buffer,
    ref int bufferSize);

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

    public static bool IsDefaultPrinterAssigned()
    {
        //initialise size at 0, used to determine size of the buffer
        int size = 0;

        //for first call provide a null StringBuilder and 0 size to determine buffer size
        //return value will be false, as the call actually fails internally setting the size to the size of the buffer
        GetDefaultPrinter(null, ref size);

        if (size != 0)
        {
            //default printer set
            return true;
        }

        return false;
    }

Используйте эту функцию, чтобы вернуть имя принтера по умолчанию, возвращает пустую строку, если значение по умолчанию не установлено:

    public static string GetDefaultPrinterName()
    {
        //initialise size at 0, used to determine size of the buffer
        int size = 0;

        //for first call provide a null StringBuilder and 0 size to determine buffer size
        //return value will be false, as the call actually fails internally setting the size to the size of the buffer
        GetDefaultPrinter(null, ref size);

        if (size == 0)
        {
            //no default printer set
            return "";
        }

        StringBuilder printerNameStringBuilder = new StringBuilder(size);

        bool success = GetDefaultPrinter(printerNameStringBuilder, ref size);

        if (!success)
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        return printerNameStringBuilder.ToString();
    }

Полныйкод для тестирования в консольном приложении:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

namespace DefaultPrinter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(IsDefaultPrinterAssigned());
            Console.WriteLine(GetDefaultPrinterName());
            Console.ReadLine();
        }

        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool GetDefaultPrinter(
            StringBuilder buffer,
            ref int bufferSize);

        public static bool IsDefaultPrinterAssigned()
        {
            //initialise size at 0, used to determine size of the buffer
            int size = 0;

            //for first call provide a null StringBuilder to and 0 size to determine buffer size
            //return value will be false, as the call actually fails internally setting the size to the size of the buffer
            GetDefaultPrinter(null, ref size);

            if (size != 0)
            {
                //default printer set
                return true;
            }

            return false;
        }

        public static string GetDefaultPrinterName()
        {
            //initialise size at 0, used to determine size of the buffer
            int size = 0;

            //for first call provide a null StringBuilder to and 0 size to determine buffer size
            //return value will be false, as the call actually fails internally setting the size to the size of the buffer
            GetDefaultPrinter(null, ref size);

            if (size == 0)
            {
                //no default printer set
                return "";
            }

            StringBuilder printerNameStringBuilder = new StringBuilder(size);

            bool success = GetDefaultPrinter(printerNameStringBuilder, ref size);

            if (!success)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }

            return printerNameStringBuilder.ToString();
        }
    }
}
3 голосов
/ 13 августа 2010

В .NET у меня работает этот код:

public static string DefaultPrinterName()
{
  string functionReturnValue = null;
  System.Drawing.Printing.PrinterSettings oPS 
    = new System.Drawing.Printing.PrinterSettings();

  try
  {
    functionReturnValue = oPS.PrinterName;
  }
  catch (System.Exception ex)
  {
    functionReturnValue = "";
  }
  finally
  {
    oPS = null;
  }
  return functionReturnValue;
}

От: http://in.answers.yahoo.com/question/index?qid=20070920032312AAsSaPx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...