The GetDefaultPrinter function retrieves the printer name of the default printer for the current user on the local computer
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int pcchBuffer);
Declare Function GetDefaultPrinter Lib "winspool.drv" Alias "GetDefaultPrinterA" _
(ByVal pszBuffer As System.Text.StringBuilder, ByRef pcchBuffer As Int32) As Boolean
None.
Works even if print spooler service is stopped (W2K)
You will need to import System.Runtime.InteropServices.
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
Do you know one? Please contribute it!