static bool PrinterSupportsPostScript(string printername)
{
List<Int32> PSChecks = new List<Int32>();
PSChecks.Add(POSTSCRIPT_PASSTHROUGH);
PSChecks.Add(ENCAPSULATED_POSTSCRIPT);
PSChecks.Add(POSTSCRIPT_IDENTIFY);
PSChecks.Add(POSTSCRIPT_INJECTION);
PSChecks.Add(POSTSCRIPT_DATA);
PSChecks.Add(POSTSCRIPT_IGNORE);
IntPtr hDC = IntPtr.Zero;
IntPtr BLOB = IntPtr.Zero;
try {
hDC = CreateDC(null, printername, null, IntPtr.Zero);
int isz = 4;
BLOB = Marshal.AllocCoTaskMem(isz);
Marshal.WriteInt32(BLOB, GETTECHNOLOGY);
int test = ExtEscape(hDC, QUERYESCSUPPORT, 4, BLOB, 0, IntPtr.Zero);
if (test == 0) return false; // printer driver does not support GETTECHNOLOGY Checks.
foreach (Int32 val in PSChecks) {
Marshal.WriteInt32(BLOB, val);
test = ExtEscape(hDC, QUERYESCSUPPORT, isz, BLOB, 0, IntPtr.Zero);
if (test != 0) return true; // if any of the checks pass, return true
}
}
catch (Exception) {
return false;
}
finally {
if (hDC != IntPtr.Zero) DeleteDC(hDC);
if (BLOB != IntPtr.Zero) Marshal.FreeCoTaskMem(BLOB);
}
return false;
}