C# 从C到Word 2007的灰度打印#

C# 从C到Word 2007的灰度打印#,c#,ms-word,ms-office,C#,Ms Word,Ms Office,我正在使用VisualStudio2010创建Word模板。我创建了一个带有to按钮的功能区:以彩色打印,以黑白打印。我使用Document.printout()函数打印文档 如何将打印机设置为从代码进行灰度打印? 我不想使用printDialog 我试着用这个: PrinterSettings settings = new PrinterSettings(); settings.DefaultPageSettings.Color = false; 但这与Word结合使用不起作用,我找到了

我正在使用VisualStudio2010创建Word模板。我创建了一个带有to按钮的功能区:以彩色打印,以黑白打印。我使用Document.printout()函数打印文档

如何将打印机设置为从代码进行灰度打印?
我不想使用printDialog

我试着用这个:

PrinterSettings settings = new PrinterSettings();  
settings.DefaultPageSettings.Color = false;

但这与Word结合使用不起作用,我找到了一个使用DEVMODE和一些pinvoke的解决方案

Devmode:() 此结构包含有关打印机环境和设备初始化的信息

它包含一个字段:dmColor(short)将其设置为1表示灰度/单色,将其设置为2表示颜色。更改此设置将直接影响打印机并覆盖用户设置

[DllImport(“winspool.drv”,CharSet=CharSet.Ansi,SetLastError=true)]
专用静态外部bool SetPrinter(IntPtr hPrinter,int-Level,IntPtr pPrinter,int命令)

PrinterName可通过以下方式检索:
System.Drawing.Printing.PrinterSettings.Installed打印机

public bool setPrinterToGrayScale(string printerName) 
{
  short monochroom = 1;
  dm = this.GetPrinterSettings(printerName);
  dm.dmColor = monochroom;

  Marshal.StructureToPtr(dm, yDevModeData, true);
  pinfo.pDevMode = yDevModeData;
  pinfo.pSecurityDescriptor = IntPtr.Zero;

  Marshal.StructureToPtr(pinfo, ptrPrinterInfo, true);
  lastError = Marshal.GetLastWin32Error();

  nRet = Convert.ToInt16(SetPrinter(hPrinter, 2, ptrPrinterInfo, 0));
  if (nRet == 0)
  {
    //Unable to set shared printer settings.

    lastError = Marshal.GetLastWin32Error();
    //string myErrMsg = GetErrorMessage(lastError);

    throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());

   }
   if (hPrinter != IntPtr.Zero)
      ClosePrinter(hPrinter);
    return Convert.ToBoolean(nRet);
}