วิธีการส่งข้อมูลไปยังเครื่องพิมพ์ โดยใช้ Visual C# .NET

การสนับสนุนสำหรับ Windows XP สิ้นสุดลงแล้ว

Microsoft ได้หยุดให้การสนับสนุนสำหรับWindows XP เมื่อวันที่ 8 เมษายน 2014 การเปลี่ยนแปลงครั้งนี้ได้ส่งผลกระทบต่อการอัปเดตซอฟต์แวร์ของคุณและตัวเลือกในการรักษาความปลอดภัย การเปลี่ยนแปลงนี้จะส่งผลอย่างไรกับคุณและทำอย่างไรเพื่อให้คอมพิวเตอร์ของคุณยังได้รับการปกป้องอยู่

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:322091
บทความนี้ถูกเก็บถาวรแล้วเนื้อหาของบทความจึงถูกนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก
สำหรับ Microsoft Visual Basic .NET รุ่นของบทความนี้ ให้ดู 322090.
สำหรับการจัดการ c ++รุ่นบทความนี้ ให้ดูบทความในฐานความรู้ของ Microsoft ต่อไปนี้:
138594 วิธีการส่งข้อมูลไปยังเครื่องพิมพ์ โดยใช้ Win32 API
บทความนี้อ้างอิงไปยังไลบรารีคลาสของ Microsoft .NET Framework namespaces ดังต่อไปนี้:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

ในงานนี้

สรุป
บทความทีละขั้นตอนนี้แสดงวิธีการใช้ฟังก์ชันตัวจัดคิวงาน Win32 จากโปรแกรมที่คุณสร้าง โดยใช้ Visual C# .NET

back to the top

ข้อมูลเพิ่มเติม

เมื่อต้องการส่งข้อมูลไปยังเครื่องพิมพ์จาก Microsoft .NET Framework โปรแกรมคุณต้องทำงานกับฟังก์ชันตัวจัดคิวงาน Win32 คุณสามารถพิมพ์ โดยใช้PrintDocument, PrintControllerและคลาสที่เกี่ยวข้องโดยใช้.NET Framework อย่างไรก็ตาม โดยใช้.NET Framework คุณไม่สามารถส่งข้อมูลพร้อมเครื่องพิมพ์แท็กไปยังเครื่องพิมพ์

คุณอาจต้องส่งข้อมูลไปยังเครื่องพิมพ์เพื่อดำเนินการต่อไปนี้:
  • ส่ง escape ลำดับ
  • ดาวน์โหลด และจากนั้น ให้ใช้แบบอักษรแบบ soft
  • แฟ้มที่เก็บพักที่พิมพ์ล่วงหน้า
เมื่อต้องการส่งชนิดเหล่านี้และข้อมูลดิบชนิดอื่น ๆ ไปยังเครื่องพิมพ์ รหัสของคุณต้องทำงานร่วมกับ Win32 Spooler แอพลิเคชันโปรแกรมเมอร์อินเทอร์เฟซ (Api) รหัสต่อไปนี้แสดงวิธีการอ่านเนื้อหาของแฟ้มที่จัดลงในหน่วยความจำ และจากนั้น ส่งไบต์เหล่านั้นไปยังเครื่องพิมพ์ โดยใช้WritePrinter

หมายเหตุ: คุณไม่สามารถใช้วิธีการนี้ในงานพิมพ์เดียวกันเป็นงานพิมพ์PrintDocumentดั้งเดิมได้ คุณต้องใช้.NET Framework เพื่อพิมพ์ หรือส่งไบต์ที่งานพิมพ์ของคุณเอง

back to the top

สร้างโครงการที่พิมพ์ข้อมูลแท็ก

  1. เริ่ม Visual Studio .NET บนเมนูแฟ้มคลิกสร้างแล้ว คลิ กโครงการ ภายใต้ชนิดโครงการคลิกโฟลเดอร์โครงการ Visual C# ในรายการเท็มเพลตแอพลิเคชันของ Windowsคลิก และจากนั้น คลิกตกลง โดยค่าเริ่มต้น Form1 จะถูกสร้างขึ้น
  2. บนเมนูมุมมองคลิกเครื่องมือเพื่อแสดงกล่องเครื่องมือ แล้ว เพิ่มปุ่มไปที่ Form1 ปุ่มนี้จะมีชื่อว่า Button1
  3. เพิ่มอีกปุ่มไปที่ Form1 ปุ่มนี้จะมีชื่อว่า Button2
  4. คลิกสองครั้งที่Button1 หน้าต่างรหัสสำหรับแบบฟอร์มปรากฏขึ้น
  5. แทนที่ของ subroutine Button1_Clickด้วยรหัสต่อไปนี้:
    private void button1_Click(object sender, System.EventArgs e){    // Allow the user to select a file.    OpenFileDialog ofd = new OpenFileDialog();    if( DialogResult.OK == ofd.ShowDialog(this) )    {        // Allow the user to select a printer.        PrintDialog pd  = new PrintDialog();        pd.PrinterSettings = new PrinterSettings();        if( DialogResult.OK == pd.ShowDialog(this) )        {            // Print the file to the printer.            RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);        }    }}					
  6. แทนที่ของ subroutine Button2_Clickด้วยรหัสต่อไปนี้:
    private void button2_Click(object sender, System.EventArgs e){    string s = "Hello"; // device-dependent string, need a FormFeed?        // Allow the user to select a printer.    PrintDialog pd  = new PrintDialog();    pd.PrinterSettings = new PrinterSettings();    if( DialogResult.OK == pd.ShowDialog(this) )    {        // Send a printer-specific to the printer.        RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);    }}					
  7. แทรกรหัสต่อไปนี้ที่ด้านบนของแฟ้ม:
    using System;using System.Drawing;using System.Drawing.Printing;using System.Windows.Forms;using System.Runtime.InteropServices;					
  8. เพิ่มรหัสต่อไปนี้ภาย ใน namespace ของแอพลิเคชันหลัก แต่ภายนอกข้อกำหนดคลาส:
    public class RawPrinterHelper{    // Structure and API declarions:    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]    public class DOCINFOA    {        [MarshalAs(UnmanagedType.LPStr)] public string pDocName;        [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;        [MarshalAs(UnmanagedType.LPStr)] public string pDataType;    }    [DllImport("winspool.Drv", EntryPoint="OpenPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);    [DllImport("winspool.Drv", EntryPoint="ClosePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool ClosePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartDocPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);    [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndDocPrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten );    // SendBytesToPrinter()    // When the function is given a printer name and an unmanaged array    // of bytes, the function sends those bytes to the print queue.    // Returns true on success, false on failure.    public static bool SendBytesToPrinter( string szPrinterName, IntPtr pBytes, Int32 dwCount)    {        Int32    dwError = 0, dwWritten = 0;        IntPtr    hPrinter = new IntPtr(0);        DOCINFOA    di = new DOCINFOA();        bool    bSuccess = false; // Assume failure unless you specifically succeed.        di.pDocName = "My C#.NET RAW Document";        di.pDataType = "RAW";        // Open the printer.        if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )        {            // Start a document.            if( StartDocPrinter(hPrinter, 1, di) )            {                // Start a page.                if( StartPagePrinter(hPrinter) )                {                    // Write your bytes.                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);                    EndPagePrinter(hPrinter);                }                EndDocPrinter(hPrinter);            }            ClosePrinter(hPrinter);        }        // If you did not succeed, GetLastError may give more information        // about why not.        if( bSuccess == false )        {                dwError = Marshal.GetLastWin32Error();        }        return bSuccess;    }    public static bool SendFileToPrinter( string szPrinterName, string szFileName )    {        // Open the file.        FileStream fs = new FileStream(szFileName, FileMode.Open);        // Create a BinaryReader on the file.        BinaryReader br = new BinaryReader(fs);        // Dim an array of bytes big enough to hold the file's contents.        Byte []bytes = new Byte[fs.Length];        bool bSuccess = false;        // Your unmanaged pointer.        IntPtr pUnmanagedBytes = new IntPtr(0);        int nLength;        nLength = Convert.ToInt32(fs.Length);        // Read the contents of the file into the array.        bytes = br.ReadBytes( nLength );        // Allocate some unmanaged memory for those bytes.        pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);        // Copy the managed byte array into the unmanaged array.        Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);        // Send the unmanaged bytes to the printer.        bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);        // Free the unmanaged memory that you allocated earlier.        Marshal.FreeCoTaskMem(pUnmanagedBytes);        return bSuccess;    }    public static bool SendStringToPrinter( string szPrinterName, string szString )    {        IntPtr pBytes;        Int32 dwCount;        // How many characters are in the string?        dwCount = szString.Length;        // Assume that the printer is expecting ANSI text, and then convert        // the string to ANSI text.        pBytes = Marshal.StringToCoTaskMemAnsi(szString);        // Send the converted ANSI string to the printer.        SendBytesToPrinter(szPrinterName, pBytes, dwCount);        Marshal.FreeCoTaskMem(pBytes);        return true;    }}					
  9. กด F5 เพื่อสร้าง และจากนั้น เรียกใช้โปรแกรมนี้
  10. คลิกButton1เพื่อโหลด และพิมพ์เนื้อหาของแฟ้ม
  11. คลิกButton2เพื่อพิมพ์สายอักขระ (คุณอาจจำเป็นต้องเลื่อนหน้าด้วยตนเองเนื่องจากสายอักขระจะถูกส่ง โดยไม่มีคำสั่งformfeed )
back to the top
ข้อมูลอ้างอิง
สำหรับข้อมูลเพิ่มเติม คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
138594 วิธีการส่งข้อมูลไปยังเครื่องพิมพ์ โดยใช้ Win32 API
back to the top
อุปกรณ์ RAW พอร์ตดาวน์โหลดอักษรนุ่ม

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 322091 - การตรวจสอบครั้งสุดท้าย: 12/07/2015 10:54:26 - ฉบับแก้ไข: 5.0

Microsoft Windows XP Professional Edition

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtth
คำติชม