Re: Изменить настройки принтера функцией DocumentProperties
От: krushon Россия  
Дата: 06.01.11 01:52
Оценка:
Думаю, решение уже нашлось. Но т.к. я тоже с этим провел почти весь день, и начинал я с Ваших набросок, вот что у меня получилось.
Пришлось всеже использовать 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);

        }

    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.