Изменить настройки принтера функцией DocumentProperties
От: Весельчак У  
Дата: 08.12.10 16:14
Оценка:
Добрый день!

Я пишу программку на C#, задача которой — изменение настроек принтера с помощью функции WinAPI DocumentProperties. Точнее, я хочу изменить приватные настройки драйвера принтера, путем изменения битового содержимого памяти, полученного при считывании настроек.

Вот код, который я использую:


 public enum DevModeOption
 {
  DM_UPDATE = 1,
  DM_COPY = 2,
  DM_PROMPT = 4,
  DM_MODIFY = 8,
  DM_IN_BUFFER = DM_MODIFY,
  DM_IN_PROMPT = DM_PROMPT,
  DM_OUT_BUFFER = DM_COPY,
  DM_OUT_DEFAULT = DM_UPDATE,
 }

  [DllImport("WinSpool.drv", EntryPoint = "DocumentPropertiesA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]  
static extern unsafe int DocumentProperties(IntPtr hWnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPStr)] string pDeviceName, 
    IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);


    public void SetPrinterData(IntPtr formHandle, string PrinterName, List<DifferByteInfo> differBytes)
    {
      PrinterSettings psSettings = new PrinterSettings();
      psSettings.PrinterName = PrinterName;

      IntPtr ipDevMode = psSettings.GetHdevmode(psSettings.DefaultPageSettings);
      IntPtr pDevMode = GlobalLock(ipDevMode);
      IntPtr ipDevModeData = Marshal.AllocHGlobal(0);
      try
      {
        int nSize = DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, pDevMode, pDevMode, 0);
        ipDevModeData = Marshal.AllocHGlobal(nSize);
        DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, ipDevModeData, pDevMode,
                  (int)DevModeOption.DM_OUT_BUFFER);
        DEVMODE d2 = (DEVMODE)Marshal.PtrToStructure(ipDevModeData, typeof(DEVMODE));

        foreach (DifferByteInfo b in differBytes)
        {
          Marshal.WriteByte(ipDevModeData, d2.dmSize + b.index, b.value);  
        }
        
        //DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, IntPtr.Zero, ipDevModeData,(int)DevModeOption.DM_MODIFY);
        //DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, ipDevModeData, ipDevModeData,
        //          (int) DevModeOption.DM_IN_BUFFER + (int) DevModeOption.DM_OUT_BUFFER);
        DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, IntPtr.Zero, ipDevModeData, (int)DevModeOption.DM_IN_BUFFER);

        GlobalUnlock(ipDevMode);
      }
      finally
      {
        GlobalFree(ipDevMode);
        Marshal.FreeHGlobal(ipDevModeData);
      }
    }



К сожалению он не работает. Подскажите, пожалуйста, в чем может быть дело?

С уважением, Николай.
documentproperties печать принтер c# winapi драйвер
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.