There is a function in the unmanaged Print Spooler API winspool.drv
. You can call the GetDefaultPrinter
function to return the name of the default printer.
This is the P/Invoke signature for the unmanaged function:
[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
private static extern bool GetDefaultPrinter(
StringBuilder buffer,
ref int bufferSize);
Use this function to determine whether a default printer is set:
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;
}
Use this function to return the default printer name, returns empty string if default is not set:
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();
}
Full code to test in a Console Application:
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();
}
}
}