GetDefaultPrinter (winspool)
Last changed: -62.227.250.230

.
Summary

The GetDefaultPrinter function retrieves the printer name of the default printer for the current user on the local computer

C# Signature:

[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int pcchBuffer);

VB Signature:

Declare Function GetDefaultPrinter Lib "winspool.drv" Alias "GetDefaultPrinterA" _
(ByVal pszBuffer As System.Text.StringBuilder, ByRef pcchBuffer As Int32) As Boolean

User-Defined Types:

None.

Notes:

Works even if print spooler service is stopped (W2K)

You will need to import System.Runtime.InteropServices.

Tips & Tricks:

Sample Code:

private const int ERROR_FILE_NOT_FOUND = 2;

private const int ERROR_INSUFFICIENT_BUFFER = 122;

public static String getDefaultPrinter()

{

    int pcchBuffer = 0;
    if (GetDefaultPrinter(null, ref pcchBuffer))
    {
    return null;
    }
    int lastWin32Error = Marshal.GetLastWin32Error();
    if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
    {
    StringBuilder pszBuffer = new StringBuilder(pcchBuffer);
    if (GetDefaultPrinter(pszBuffer, ref pcchBuffer))
    {
        return pszBuffer.ToString();
    }
    lastWin32Error = Marshal.GetLastWin32Error();
    }
    if (lastWin32Error == ERROR_FILE_NOT_FOUND)
    {
    return null;
    }
    throw new Win32Exception(Marshal.GetLastWin32Error());

}

VB.Net sample code:

    Private Shared Function _getDefaultPrinterName() As String
    Dim pszBuffer As System.Text.StringBuilder = New System.Text.StringBuilder(100)
    pszBuffer.Length = 100
    Dim pcchBuffer As Integer = CInt(pszBuffer.Length)
    Dim retVal As Boolean = GetDefaultPrinter(pszBuffer, pcchBuffer)
    Return pszBuffer.ToString.Trim    'StringBuilder manages the null-terminated string
    End Function

Alternative Managed API:

Do you know one? Please contribute it!

Documentation