经理原话“你帮我用C#调用windows打印功能。实现一个对打印机控制的程序,实现功能是 1去取打印机状态 2去取打印机的队列. 3暂停。因为手头没有真的打印机。所以就下在了个虚拟的打印机。
下载了许多C#的源代码。大多都是有“预览” “打印”功能的。打印的时候,在XP的“开始”—》“设置”——》“打印机和传真” 然后进入当前打印的那个打印机。发现队列里有文档。也有暂停和打印机状态。我现在的疑问是,难道经理让我做的程序就是取这里面的一些数据么?请问高手帮忙分析下,我理解的是否正确?这样的程序可行么?
或者是,我把问题想复杂了,下载的那些程序已经可以满足经理的要求了!
从来就没接触过打印机这方面东西,希望懂的朋友能帮忙分析下!有时间的话尽量说细点,拜托了!!万分感激!!!!

解决方案 »

  1.   


    要获得打印机的状态,应该定义一个联合.enum PrinterStatus 
    {
     其他状态= 1,
     未知,
     空闲,
     正在打印,
     预热,
     停止打印,
     打印中,
     离线
    }其中的"正在打印"和"打印中"是同一个意思,至于为什么会是这样,目前还不知道.在程序中添加System.Management的引用:using System.Management;然后编写获取打印机状态的函数如下:/// <summary>
      /// 获取打印机的当前状态
      /// </summary>
      /// <param name="PrinterDevice">打印机设备名称</param>
      /// <returns>打印机状态</returns>
      private PrinterStatus GetPrinterStat(string PrinterDevice)
      {
       PrinterStatus ret=0;
       string path=@"win32_printer.DeviceId='"+PrinterDevice+"'";
       ManagementObject printer=new ManagementObject(path);
       printer.Get();
       ret=(PrinterStatus)Convert.ToInt32(printer.Properties["PrinterStatus"].Value);
       return ret;
      }调用示例:MessageBox.Show(GetPrinterStat("\\\\192.168.0.88\\Samsung SCX-4x16 Series").ToString());Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=352678补充:System.Windows.Forms.MessageBox.Show(printer.Properties["WorkOffline"].Value.ToString());可以获取打印机是否离线.
      

  2.   


      Private   Const   CCHDEVICENAME   =   32   
      Private   Const   CCHFORMNAME   =   32   
      Private   Type   DEVMODE   
              dmDeviceName   As   String   *   CCHDEVICENAME   
              dmSpecVersion   As   Integer   
              dmDriverVersion   As   Integer   
              dmSize   As   Integer   
              dmDriverExtra   As   Integer   
              dmFields   As   Long   
              dmOrientation   As   Integer   
              dmPaperSize   As   Integer   
              dmPaperLength   As   Integer   
              dmPaperWidth   As   Integer   
              dmScale   As   Integer   
              dmCopies   As   Integer   
              dmDefaultSource   As   Integer   
              dmPrintQuality   As   Integer   
              dmColor   As   Integer   
              dmDuplex   As   Integer   
              dmYResolution   As   Integer   
              dmTTOption   As   Integer   
              dmCollate   As   Integer   
              dmFormName   As   String   *   CCHFORMNAME   
              dmUnusedPadding   As   Integer   
              dmBitsPerPel   As   Integer   
              dmPelsWidth   As   Long   
              dmPelsHeight   As   Long   
              dmDisplayFlags   As   Long   
              dmDisplayFrequency   As   Long   
      End   Type   
      Private   Type   PRINTER_INFO_2   
            pServerName   As   String   
            pPrinterName   As   String   
            pShareName   As   String   
            pPortName   As   String   
            pDriverName   As   String   
            pComment   As   String   
            pLocation   As   String   
            pDevMode   As   Long   
            pSepFile   As   String   
            pPrintProcessor   As   String   
            pDatatype   As   String   
            pParameters   As   String   
            pSecurityDescriptor   As   Long   
            Attributes   As   Long   
            Priority   As   Long   
            DefaultPriority   As   Long   
            StartTime   As   Long   
            UntilTime   As   Long   
            Status   As   Long   
            JobsCount   As   Long   
            AveragePPM   As   Long   
      End   Type   
      Private   Type   PRINTER_DEFAULTS   
          pDatatype   As   String   
          pDevMode   As   DEVMODE   
          DesiredAccess   As   Long   
      End   Type   
      Public   Enum   Printer_Status   
            PRINTER_STATUS_READY   =   &H0   
            PRINTER_STATUS_PAUSED   =   &H1   
            PRINTER_STATUS_ERROR   =   &H2   
            PRINTER_STATUS_PENDING_DELETION   =   &H4   
            PRINTER_STATUS_PAPER_JAM   =   &H8   
            PRINTER_STATUS_PAPER_OUT   =   &H10   
            PRINTER_STATUS_MANUAL_FEED   =   &H20   
            PRINTER_STATUS_PAPER_PROBLEM   =   &H40   
            PRINTER_STATUS_OFFLINE   =   &H80   
            PRINTER_STATUS_IO_ACTIVE   =   &H100   
            PRINTER_STATUS_BUSY   =   &H200   
            PRINTER_STATUS_PRINTING   =   &H400   
            PRINTER_STATUS_OUTPUT_BIN_FULL   =   &H800   
            PRINTER_STATUS_NOT_AVAILABLE   =   &H1000   
            PRINTER_STATUS_WAITING   =   &H2000   
            PRINTER_STATUS_PROCESSING   =   &H4000   
            PRINTER_STATUS_INITIALIZING   =   &H8000   
            PRINTER_STATUS_WARMING_UP   =   &H10000   
            PRINTER_STATUS_TONER_LOW   =   &H20000   
            PRINTER_STATUS_NO_TONER   =   &H40000   
            PRINTER_STATUS_PAGE_PUNT   =   &H80000   
            PRINTER_STATUS_USER_INTERVENTION   =   &H100000   
            PRINTER_STATUS_OUT_OF_MEMORY   =   &H200000   
            PRINTER_STATUS_DOOR_OPEN   =   &H400000   
            PRINTER_STATUS_SERVER_UNKNOWN   =   &H800000   
            PRINTER_STATUS_POWER_SAVE   =   &H1000000   
      End   Enum   
      Private   Declare   Function   OpenPrinter   Lib   "winspool.drv"   Alias   "OpenPrinterA"   (ByVal   pPrinterName   As   String,   phPrinter   As   Long,   pDefault   As   PRINTER_DEFAULTS)   As   Long   
      Private   Declare   Function   GetPrinter   Lib   "winspool.drv"   Alias   "GetPrinterA"   (ByVal   hPrinter   As   Long,   ByVal   Level   As   Long,   buffer   As   Long,   ByVal   pbSize   As   Long,   pbSizeNeeded   As   Long)   As   Long   
      Private   Declare   Function   ClosePrinter   Lib   "winspool.drv"   (ByVal   hPrinter   As   Long)   As   Long   
      Private   Declare   Sub   CopyMemory   Lib   "kernel32"   Alias   "RtlMoveMemory"   (Destination   As   Any,   Source   As   Any,   ByVal   Length   As   Long)   
      Private   Declare   Function   IsBadStringPtrByLong   Lib   "kernel32"   Alias   "IsBadStringPtrA"   (ByVal   lpsz   As   Long,   ByVal   ucchMax   As   Long)   As   Long   
      Public   Function   StringFromPointer(lpString   As   Long,   lMaxLength   As   Long)   As   String   
              Dim   sRet   As   String   
              Dim   lret   As   Long   
              If   lpString   =   0   Then   
                      StringFromPointer   =   ""   
                      Exit   Function   
              End   If   
              If   IsBadStringPtrByLong(lpString,   lMaxLength)   Then   
                      '   An   error   has   occured   -   do   not   attempt   to   use   this   pointer   
                      StringFromPointer   =   ""   
                      Exit   Function   
              End   If   
              '   Pre-initialise   the   return   string...   
              sRet   =   Space$(lMaxLength)   
              CopyMemory   ByVal   sRet,   ByVal   lpString,   ByVal   Len(sRet)   
              If   Err.LastDllError   =   0   Then   
                      If   InStr(sRet,   Chr$(0))   >   0   Then   
                              sRet   =   Left$(sRet,   InStr(sRet,   Chr$(0))   -   1)   
                      End   If   
              End   If   
              StringFromPointer   =   sRet   
      End   Function   
      Private   Sub   Form_Load()   
              Dim   SizeNeeded   As   Long,   buffer()   As   Long   
              Dim   pDef   As   PRINTER_DEFAULTS   
              'Get   a   handle   to   the   printer   
              lret   =   OpenPrinter(Printer.DeviceName,   mhPrinter,   pDef)   
              'Initialize   the   buffer   
              ReDim   Preserve   buffer(0   To   0)   As   Long   
              'Retrieve   the   required   size   (in   bytes)   
              lret   =   GetPrinter(mhPrinter,   2,   buffer(0),   UBound(buffer),   SizeNeeded)   
              'Resize   the   buffer...   Note   that   a   Long   is   four   bytes   
              ReDim   Preserve   buffer(0   To   (SizeNeeded   /   4)   +   3)   As   Long   
              'Retrieve   the   Printer   information   
              lret   =   GetPrinter(mhPrinter,   2,   buffer(0),   UBound(buffer)   *   4,   SizeNeeded)   
              'The   data   stored   in   'buffer'   corresponds   with   the   data   of   a   PRINTER_INFO_2   structure   
              ClosePrinter   mhPrinter   
              'Show   the   data   
              PrintData   "Server   name",   StringFromPointer(buffer(0),   255)   
              PrintData   "Printer   name",   StringFromPointer(buffer(1),   255)   
              PrintData   "Share   name",   StringFromPointer(buffer(2),   255)   
              PrintData   "Port   name",   StringFromPointer(buffer(3),   255)   
              PrintData   "Driver   name",   StringFromPointer(buffer(4),   255)   
              PrintData   "Comment",   StringFromPointer(buffer(5),   255)   
              PrintData   "Location",   StringFromPointer(buffer(6),   255)   
              Unload   Me   
      End   Sub   
      Sub   PrintData(Name   As   String,   Data   As   String)   
              If   LenB(Data)   >   0   Then   
                      Debug.Print   Name   +   ":   "   +   Data   
              End   If   
      End   Sub   
      

  3.   

    上面是VB的源码你可以去转成c# 转换还不会太复杂吧。
      

  4.   

    DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool EnumPrinters ([MarshalAs(UnmanagedType.U4)] PRINTER_ENUM flags, 
    [MarshalAs(UnmanagedType.LPStr)] string sName, 
    uint iLevel, 
    IntPtr pPrinterDesc, 
    uint iSize, 
    [MarshalAs(UnmanagedType.U4)] ref uint iNeeded, 
    [MarshalAs(UnmanagedType.U4)] ref uint iReturned 
    ); 
    打印机设置
      

  5.   

    晕了!不知道你用什么型号的打印机了!我用佳能的,是佳能的CP790照片打印机,可以自己打印照片了!携带也很方便,感兴趣的话可以看看http://www.canon.com.cn/products/printer/selphy/chuanxinyi/index.html