如何傳送到印表機的未經處理的資料,藉由使用 Visual Basic.NET

Windows XP 支援已結束

Microsoft 於 2014 年 4 月 8 日結束對 Windows XP 的支援。此變更已影響您的軟體更新和安全性選項。 瞭解這對您的意義為何且如何持續受保護。

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:322090
本文已封存。本文係以「現狀」提供且不會再更新。
本文章的有 Microsoft Visual C#.NET] 版本請參閱 322091
如在 Microsoft Visual 基本的 6.0 版的這篇文章請參閱 154078
這篇文章的 Unmanaged C + + 版本中,請參閱 138594 文件。

本文參照下列 Microsoft.NET Framework 類別庫命名空間:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropService

在此工作

結論
本文將逐步告訴您如何使用 Win32 多工緩衝處理程式函數,您使用 Visual Basic.NET 所建立的程式。

詳細資訊

若要傳送到印表機的未經處理的資料,從 Microsoft.NET Framework,您的程式必須使用 Win32 多工緩衝處理程式函數。透過在.NET Framework,您可以使用列印 PrintDocumentPrintController 和相關聯的類別。但是,您無法與.NET] Framework 預先設定格式的印表機可供資料傳送到印表機。

您可能必須將未經處理的資料傳送到印表機,以執行下列動作:
  • 傳送逸出序列。
  • 下載,然後再使用 [軟體字型。
  • 預先印好的檔案的多工緩衝處理。
這些型別及其他類型的未經處理的資料傳送到印表機,您的程式碼必須使用 Win32 多工緩衝處理程式的應用程式開發介面 (API)。下列程式碼將示範如何預先設定格式的檔案內容讀入記憶體,並再將這些位元組藉由使用 WritePrinter 傳送至印表機。

注意: 您不能在相同的列印工作以原生的 PrintDocument 列印工作中使用這種方法。您必須使用.NET Framework 列印或傳送您自己的列印工作位元組。


建立列印預先設定格式的資料的專案

若要建立專案,請依照下列步驟執行:
  1. 啟動 Visual Studio.NET。在 [檔案] 功能表上按一下 [新增],然後按一下 [專案]。在 [專案類型 下, 按一下 [Visual Basic 專案] 資料夾。範本] 清單上按一下 [Windows 應用程式,然後按一下 [確定]]。依照預設值,會建立 Form1。
  2. 在 [檢視] 功能表上按一下 [工具箱],以顯示 [工具箱],然後再新增到 Form1 的 [按鈕]。此按鈕會命名為 Button1。
  3. 將另一個 按鈕 加入至 Form1。此按鈕會命名為 Button2。
  4. 連按兩下 [Button1]。在表單的 [程式碼] 視窗隨即出現。
  5. 以下列程式碼取代 Button1_Click 副程式:
        ' Click event handler for a button - designed to show how to use the    ' SendFileToPrinter and SendBytesToPrinter functions.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        ' Allow the user to select a file.        Dim ofd As New OpenFileDialog()        If ofd.ShowDialog(Me) Then            ' Allow the user to select a printer.            Dim pd As New PrintDialog()            pd.PrinterSettings = New PrinterSettings()            If (pd.ShowDialog() = DialogResult.OK) Then                ' Print the file to the printer.                RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName)            End If        End If    End Sub ' Button1_Click()					
  6. 以下列程式碼取代 Button2_Click 副程式:
        ' Click event handler for a button - designed to show how to use the    ' SendBytesToPrinter function to send a string to the printer.    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        Dim s As String        Dim pd As New PrintDialog()        ' You need a string to send.        s = "Hello, this is a test"        ' Open the printer dialog box, and then allow the user to select a printer.        pd.PrinterSettings = New PrinterSettings()        If (pd.ShowDialog() = DialogResult.OK) Then            RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s)        End If    End Sub ' Button2_Click()					
  7. 插入下列程式碼在檔案頂端:
    Imports System.IOImports System.Drawing.PrintingImports System.Runtime.InteropServices					
  8. Add the following code inside the main application namespace but outside any class definitions:
    Public Class RawPrinterHelper    ' Structure and API declarions:    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _    Structure DOCINFOW        <MarshalAs(UnmanagedType.LPWStr)> Public pDocName As String        <MarshalAs(UnmanagedType.LPWStr)> Public pOutputFile As String        <MarshalAs(UnmanagedType.LPWStr)> Public pDataType As String    End Structure    <DllImport("winspool.Drv", EntryPoint:="OpenPrinterW", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function OpenPrinter(ByVal src As String, ByRef hPrinter As IntPtr, ByVal pd As Long) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="StartDocPrinterW", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function StartDocPrinter(ByVal hPrinter As IntPtr, ByVal level As Int32, ByRef pDI As DOCINFOW) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function EndDocPrinter(ByVal hPrinter As IntPtr) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function StartPagePrinter(ByVal hPrinter As IntPtr) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function EndPagePrinter(ByVal hPrinter As IntPtr) As Boolean    End Function    <DllImport("winspool.Drv", EntryPoint:="WritePrinter", _       SetLastError:=True, CharSet:=CharSet.Unicode, _       ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _    Public Shared Function WritePrinter(ByVal hPrinter As IntPtr, ByVal pBytes As IntPtr, ByVal dwCount As Int32, ByRef dwWritten As Int32) As Boolean    End Function    ' 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 or False on failure.    Public Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Int32) As Boolean        Dim hPrinter As IntPtr      ' The printer handle.        Dim dwError As Int32        ' Last error - in case there was trouble.        Dim di As DOCINFOW          ' Describes your document (name, port, data type).        Dim dwWritten As Int32      ' The number of bytes written by WritePrinter().        Dim bSuccess As Boolean     ' Your success code.        ' Set up the DOCINFO structure.        With di            .pDocName = "My Visual Basic .NET RAW Document"            .pDataType = "RAW"        End With        ' Assume failure unless you specifically succeed.        bSuccess = False        If OpenPrinter(szPrinterName, hPrinter, 0) Then            If StartDocPrinter(hPrinter, 1, di) Then                If StartPagePrinter(hPrinter) Then                    ' Write your printer-specific bytes to the printer.                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)                    EndPagePrinter(hPrinter)                End If                EndDocPrinter(hPrinter)            End If            ClosePrinter(hPrinter)        End If        ' If you did not succeed, GetLastError may give more information        ' about why not.        If bSuccess = False Then            dwError = Marshal.GetLastWin32Error()        End If        Return bSuccess    End Function ' SendBytesToPrinter()    ' SendFileToPrinter()    ' When the function is given a file name and a printer name,     ' the function reads the contents of the file and sends the    ' contents to the printer.    ' Presumes that the file contains printer-ready data.    ' Shows how to use the SendBytesToPrinter function.    ' Returns True on success or False on failure.    Public Shared Function SendFileToPrinter(ByVal szPrinterName As String, ByVal szFileName As String) As Boolean        ' Open the file.        Dim fs As New FileStream(szFileName, FileMode.Open)        ' Create a BinaryReader on the file.        Dim br As New BinaryReader(fs)        ' Dim an array of bytes large enough to hold the file's contents.        Dim bytes(fs.Length) As Byte        Dim bSuccess As Boolean        ' Your unmanaged pointer.        Dim pUnmanagedBytes As IntPtr        ' Read the contents of the file into the array.        bytes = br.ReadBytes(fs.Length)        ' Allocate some unmanaged memory for those bytes.        pUnmanagedBytes = Marshal.AllocCoTaskMem(fs.Length)        ' Copy the managed byte array into the unmanaged array.        Marshal.Copy(bytes, 0, pUnmanagedBytes, fs.Length)        ' Send the unmanaged bytes to the printer.        bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, fs.Length)        ' Free the unmanaged memory that you allocated earlier.        Marshal.FreeCoTaskMem(pUnmanagedBytes)        Return bSuccess    End Function ' SendFileToPrinter()    ' When the function is given a string and a printer name,    ' the function sends the string to the printer as raw bytes.    Public Shared Function SendStringToPrinter(ByVal szPrinterName As String, ByVal szString As String)        Dim pBytes As IntPtr        Dim dwCount As Int32        ' 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)    End FunctionEnd Class					
  9. 按下 F5 以建置,並執行程式。
  10. 按一下 [Button1] 來載入及列印檔案的內容。
  11. 按一下 Button2 列印字串。(如果您必須手動退出頁面,因為沒有 formfeed 命令傳送字串。
参考
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
138594如何傳送到印表機的未經處理的資料,藉由使用 Win32 API

警告:本文為自動翻譯

內容

文章識別碼:322090 - 最後檢閱時間:12/07/2015 10:54:16 - 修訂: 7.4

Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Windows XP Professional, the operating system: Microsoft Windows XP 64-Bit Edition

  • kbnosurvey kbarchive kbmt kbdswgdi2003swept kbhowtomaster KB322090 KbMtzh
意見反應