C# 小票打印机 直接打印 无需驱动2009-07-11 10:53   
class LPTControl
    {
        #region API函数
        [StructLayout(LayoutKind.Sequential)]
        private struct OVERLAPPED
        {
            int Internal;
            int InternalHigh;
            int Offset;
            int OffSetHigh;
            int hEvent;
        }

        [DllImport("kernel32.dll")]
        private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode,
            int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

        [DllImport("kernel32.dll")]
        private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite,
            out int lpNumberOfBytesWritten, out OVERLAPPED lpOverlapped);

        [DllImport("kernel32.dll")]
        private static extern bool CloseHandle(int hObject);
        #endregion

        public enum HorPos { Left, Center, Right }

        private int iHandle;
        private int ColWidth = 32;

        public bool Open()
        {
            iHandle = CreateFile("LPT1", 0x40000000, 0, 0, 3, 0, 0);
            if (iHandle != -1)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        public bool Write(string Data)
        {
            try
            {
                if (iHandle != -1)
                {
                    int i;
                    OVERLAPPED x;
                    byte[] bData = System.Text.Encoding.Default.GetBytes(Data);
                    return WriteFile(iHandle, bData, bData.Length, out i, out x);
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }

        public bool Write(byte[] bdata)
        {
            if (bdata.Length == 0) return false;
            if (iHandle != -1)
            {
                int i;
                OVERLAPPED x;
                return WriteFile(iHandle, bdata, bdata.Length, out i, out x);
            }
            else
            {
                return false;
            }
        }

        public bool WriteLine(string Data)
        {
            bool Result = Write(Data);
            if (Result) Result = NewRow();
            return Result;
        }

        public bool WriteLine(string Data, HorPos horpos)
        {
            int Length = Encoding.Default.GetBytes(Data).Length;
            if (Length > ColWidth || HorPos.Left == horpos) return WriteLine(Data);
            switch (horpos)
            {
                case HorPos.Center:
                    Data = Data.PadLeft(Length + (ColWidth - Length) / 2 - (Length - Data.Length), ' ');
                    break;
                case HorPos.Right:
                    Data = Data.PadLeft(ColWidth - (Length - Data.Length), ' ');
                    break;
                default:
                    break;
            }
            return WriteLine(Data);
        }

        public bool Close()
        {
            return CloseHandle(iHandle);
        }

        public bool PrintLine()
        {
            return WriteLine("================================");
        }

        public bool PrintDate()
        {
            return WriteLine("打印时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        public bool NewRow()
        {
            bool Result = Write(new byte[] { 27, 10, 13 });
            return Result;
        }

        public bool NewRow(int iRow)
        {
            bool Result = false;
            for (int i = 0; i < iRow; i++)
            {
                Result = NewRow();
                if (!Result) break;
            }
            return Result;
        }

        public bool CutPaper()
        {
            NewRow(5);
            return Write(new byte[] { 27, 105 });
        }
    }

    public class Printer

    {
        #region 预定义类型
        [FlagsAttribute]
        public enum PrinterEnumFlags
        {
            PRINTER_ENUM_DEFAULT = 0x00000001,
            PRINTER_ENUM_LOCAL = 0x00000002,
            PRINTER_ENUM_CONNECTIONS = 0x00000004,
            PRINTER_ENUM_FAVORITE = 0x00000004,
            PRINTER_ENUM_NAME = 0x00000008,
            PRINTER_ENUM_REMOTE = 0x00000010,
            PRINTER_ENUM_SHARED = 0x00000020,
            PRINTER_ENUM_NETWORK = 0x00000040,
            PRINTER_ENUM_EXPAND = 0x00004000,
            PRINTER_ENUM_CONTAINER = 0x00008000,
            PRINTER_ENUM_ICONMASK = 0x00ff0000,
            PRINTER_ENUM_ICON1 = 0x00010000,
            PRINTER_ENUM_ICON2 = 0x00020000,
            PRINTER_ENUM_ICON3 = 0x00040000,
            PRINTER_ENUM_ICON4 = 0x00080000,
            PRINTER_ENUM_ICON5 = 0x00100000,
            PRINTER_ENUM_ICON6 = 0x00200000,
            PRINTER_ENUM_ICON7 = 0x00400000,
            PRINTER_ENUM_ICON8 = 0x00800000,
            PRINTER_ENUM_HIDE = 0x01000000
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct PRINTER_INFO_2
        {
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pServerName;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pPrinterName;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pShareName;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pPortName;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pDriverName;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pComment;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pLocation;
            public IntPtr pDevMode;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pSepFile;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pPrintProcessor;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pDatatype;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pParameters;
            public IntPtr pSecurityDescriptor;
            public uint Attributes;
            public uint Priority;
            public uint DefaultPriority;
            public uint StartTime;
            public uint UntilTime;
            public uint Status;
            public uint cJobs;
            public uint AveragePPM;
        }

        #endregion
        #region 引用 WindowsAPI
        //引用API声明
        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]

        private static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level,
                                        IntPtr pPrinterEnum, uint cbBuf, ref uint pcbNeeded,
                                        ref uint pcReturned);
        #endregion

        public static string[] GetPrinter()
        {
            string[] Result = null;
            PRINTER_INFO_2[] printInfo;
            printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);

            if (printInfo != null && printInfo.Length >= 0)
            {
                Result = new string[printInfo.Length];
                for (int i = 0; i < printInfo.Length; i++)
                {
                    Result[i] = printInfo[i].pPrinterName;
                }
            }
            return Result;
           
        }
       
        #region 托管代码
        /// <summary>
        /// 遍历打印机
        /// </summary>
        /// <param name="Flags"></param>
        /// <returns></returns>
        public static PRINTER_INFO_2[] EnumPrinters(PrinterEnumFlags Flags)
        {
            PRINTER_INFO_2[] Info2 = null;
            uint cbNeeded = 0;
            uint cReturned = 0;
            bool ret = EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned);
            IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
            ret = EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned);
            if(ret)
            {
                Info2 = new PRINTER_INFO_2[cReturned];
                int offset = pAddr.ToInt32();
                for (int i = 0; i < cReturned; i++)
                {
                    Info2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2));
                    offset += Marshal.SizeOf(typeof(PRINTER_INFO_2));
                }
                Marshal.FreeHGlobal(pAddr);
            }
            return Info2;
        }
        #endregion
    }


调用代码:

//不用驱动的话,不判断是否存在打印机。

if (Printer.GetPrinter() == null || Printer.GetPrinter().Length == 0)
            {
                State = "没有找到合适的打印机...";
                return;
            }

            State = "正在打印...";
            try
            {
                LPTControl lpt = new LPTControl();
                lpt.Open();
                lpt.WriteLine("数据头标题", LPTControl.HorPos.Center);
                lpt.WriteLine("数据副标题", LPTControl.HorPos.Center);
                lpt.PrintLine();
                string StrTitle = " 列名1 ";
                StrTitle += "       列名2    ";
                lpt.WriteLine(StrTitle);
                for (int i = 0; i < DSCount.Tables[0].Rows.Count; i++)
                {
                    lpt.WriteLine(DSCount.Tables[0].Rows[i][0].ToString()
                        + DSCount.Tables[0].Rows[i][1].ToString().PadLeft(11, ' '));
                }
                lpt.NewRow();
                lpt.WriteLine("合计:".PadRight(8, ' ') + LabCount.Text.PadLeft(11, ' '));
                lpt.PrintLine();
                lpt.PrintDate();
                lpt.CutPaper();
                lpt.Close();
                System.Threading.Thread.Sleep(500);
                State = "打印完成...";
            }
            catch (Exception Ex)
            {
                State = "打印出错...";
                WriteLog("打印出错:" + Ex.Message);
            }

如果没有安装打印机驱动程序,调用的时候,一定要保证打印机联机。

适用于56-58mm的纸
 

posted on 2010-01-27 17:52  阿米  阅读(1941)  评论(0编辑  收藏  举报