Думаю, решение уже нашлось. Но т.к. я тоже с этим провел почти весь день, и начинал я с Ваших набросок, вот что у меня получилось.
Пришлось всеже использовать SetPrinter. Может кто еще сюда заглянет, подскажет другой метод.
private uint PRINTER_ALL_ACCESS = 0x00000004 | 0x00000008;
...........
.........
.......
..........
private unsafe void button2_Click(object sender, EventArgs e)
{
PrinterDefaults pd = new PrinterDefaults();
pd.pDatatype = UIntPtr.Zero;
pd.pDevMode = UIntPtr.Zero;
pd.DesiredAccess = PRINTER_ALL_ACCESS;
PrinterSettings.StringCollection printers = PrinterSettings.InstalledPrinters;
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = printers[3];
IntPtr printerHandle;
bool result = OpenPrinter(printers[3], out printerHandle,ref pd);
IntPtr prS;
int hDEVMODE = DocumentProperties(this.Handle, printerHandle, printers[3], IntPtr.Zero, IntPtr.Zero, 0);
prS = GlobalAlloc(0, hDEVMODE);
IntPtr pDEVMODE = GlobalLock(prS);
int dwRet = DocumentProperties(this.Handle,
printerHandle,
printers[3],
pDEVMODE,
IntPtr.Zero,
2|4);
PrinterSettings nPS;
if (dwRet < 0)
{
GlobalUnlock(pDEVMODE);
GlobalFree(prS);
ClosePrinter(printerHandle);
return;
}
else
{
nPS = new PrinterSettings();
nPS.SetHdevmode(pDEVMODE);
}
GlobalUnlock(pDEVMODE);
GlobalFree(prS);
Byte* b = (Byte*)nPS.GetHdevmode();
bool r = SetPrinter(printerHandle, 8, b, 0);
ClosePrinter(printerHandle);
GlobalFree((IntPtr)b);
}
}