zoukankan      html  css  js  c++  java
  • C# 小票打印机 直接打印 无需驱动[转]

    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的纸

  • 相关阅读:
    合并表已经转化对象的操作
    终于也有自己的博客园一角了,权当新人报到帖了
    常见软件滤波器总结
    按键设计总结
    关于goto语句
    Delphi XE2 Default Keyboard Shortcuts
    Delphi XE2 IDE Classic Keyboard Shortcuts
    Delphi实现静态变量
    datasnap传输流/文件问题
    查询条件的封装(小结)
  • 原文地址:https://www.cnblogs.com/zbo/p/1521454.html
Copyright © 2011-2022 走看看