Winforms 从Windows应用程序打印到LPT1端口

Winforms 从Windows应用程序打印到LPT1端口,winforms,visual-studio-2015,printing,dot-matrix,lpt,Winforms,Visual Studio 2015,Printing,Dot Matrix,Lpt,我正在VS2015上构建一个windows应用程序,我需要它使用点阵式打印机上的LPT1打印简单文本。 有人能帮忙吗? 谢谢我尝试应用以下代码,但没有打印任何内容: Dim fh As IntPtr Dim SW As IO.StreamWriter Dim FS As IO.FileStream fh = Win32API.CreateFile("LPT1:", Win32API.GENERIC_WRITE, 0, 0, Win32API.CREATE_ALWAYS, 0, 0) This

我正在VS2015上构建一个windows应用程序,我需要它使用点阵式打印机上的LPT1打印简单文本。 有人能帮忙吗?
谢谢

我尝试应用以下代码,但没有打印任何内容:

Dim fh As IntPtr
Dim SW As IO.StreamWriter
Dim FS As IO.FileStream
fh = Win32API.CreateFile("LPT1:", Win32API.GENERIC_WRITE, 0, 0, 
Win32API.CREATE_ALWAYS, 0, 0)
This one works fine
fh = Win32API.CreateFile("C:\test.txt", Win32API.GENERIC_WRITE, 0, 0, 
Win32API.CREATE_ALWAYS, 0, 0)
Dim sfh As New Microsoft.Win32.SafeHandles.SafeFileHandle(fh, True)
FS = New IO.FileStream(sfh, IO.FileAccess.ReadWrite)
FS.Flush()
SW = New IO.StreamWriter(FS)
SW.WriteLine(a)
FS.Flush()
SW.Close()
FS.Close()
sfh.Close()
跟下面的班级

Public Class Win32API
    Public Const GENERIC_WRITE = &H40000000
    Public Const CREATE_ALWAYS = 2
    Public Const OPEN_EXISTING = 3
    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal 
    lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As 
    Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition 
    As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As 
    Integer) As Integer
    Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" 
    (ByVal hObject As Long) As Long
End Class
我也尝试了第二种方法,但效果不太好

 Private prn As New RawPrinterHelper
    Dim prtSettg As New PrinterSettings()

    Private PrinterName As String = prtSettg.PrinterName

    Public Sub StartPrint()

        prn.OpenPrint(PrinterName)
    End Sub

    Public Sub PrintHeader()
        Print("Simple text")

    End Sub

    Public Sub Print(Line As String)
        prn.SendStringToPrinter(PrinterName, Line + vbLf)
    End Sub

    Public Sub EndPrint()
        prn.ClosePrint()
    End Sub

    Private Sub btnCancel_Click(sender As System.Object, e As System.EventArgs) _
            Handles btnCancel.Click
        prn.ClosePrint()

        Me.Close()
    End Sub

    Private Sub btnPrint_Click(sender As System.Object, e As System.EventArgs) _
            Handles btnPrint.Click
        StartPrint()

        If prn.PrinterIsOpen = True Then
            PrintHeader()

            EndPrint()
        End If
    End Sub
在课堂上:

Imports System
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports System.IO

Public Class RawPrinterHelper
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
    Public Class DOCINFOA
        <MarshalAs(UnmanagedType.LPStr)> _
        Public pDocName As String
        <MarshalAs(UnmanagedType.LPStr)> _
        Public pOutputFile As String
        <MarshalAs(UnmanagedType.LPStr)> _
        Public pDataType As String
    End Class
    <DllImport("winspool.Drv", EntryPoint:="OpenPrinterA", _
    SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> _
    szPrinter As String, ByRef hPrinter As IntPtr, pd As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _
    SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function ClosePrinter(hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", _
    SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function StartDocPrinter(hPrinter As IntPtr, level As Int32, _
    <[In](), MarshalAs(UnmanagedType.LPStruct)> di As DOCINFOA) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", _
    SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function EndDocPrinter(hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", _
    SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function StartPagePrinter(hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", _
    SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function EndPagePrinter(hPrinter As IntPtr) As Boolean
    End Function

    <DllImport("winspool.Drv", EntryPoint:="WritePrinter", _
    SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function WritePrinter(hPrinter As IntPtr, pBytes As IntPtr, _
    dwCount As Int32, ByRef dwWritten As Int32) As Boolean
    End Function

    Private hPrinter As New IntPtr(0)
    Private di As New DOCINFOA()
    Private PrinterOpen As Boolean = False

    Public ReadOnly Property PrinterIsOpen As Boolean
        Get
            PrinterIsOpen = PrinterOpen
        End Get
    End Property

    Public Function OpenPrint(szPrinterName As String) As Boolean
        If PrinterOpen = False Then
            di.pDocName = ".NET RAW Document"
            di.pDataType = "RAW"

            If OpenPrinter(szPrinterName.Normalize(), hPrinter, IntPtr.Zero) Then
                If StartDocPrinter(hPrinter, 1, di) Then
                    If StartPagePrinter(hPrinter) Then
                        PrinterOpen = True
                    End If
                End If
            End If
        End If

        OpenPrint = PrinterOpen
    End Function

    Public Sub ClosePrint()
        If PrinterOpen Then
            EndPagePrinter(hPrinter)
            EndDocPrinter(hPrinter)
            ClosePrinter(hPrinter)
            PrinterOpen = False
        End If
    End Sub

    Public Function SendStringToPrinter(szPrinterName As String, szString As String) As Boolean
        If PrinterOpen Then
            Dim pBytes As IntPtr
            Dim dwCount As Int32
            Dim dwWritten As Int32 = 0

            dwCount = szString.Length

            pBytes = Marshal.StringToCoTaskMemAnsi(szString)

            SendStringToPrinter = WritePrinter(hPrinter, pBytes, dwCount, dwWritten)

            Marshal.FreeCoTaskMem(pBytes)
        Else
            SendStringToPrinter = False
        End If
    End Function
End Class
导入系统
导入系统。绘图
导入系统。绘图。打印
导入System.Windows.Forms
导入System.Runtime.InteropServices
导入System.IO
公共类RawPrinterHelper
_
公共类DOCINFOA
_
作为字符串的公共pDocName
_
作为字符串的公共pOutputFile
_
作为字符串的公共pDataType
末级
_
公共共享功能OpenPrinter(_
szPrinter作为字符串,ByRef hPrinter作为IntPtr,pd作为IntPtr)作为布尔值
端函数
_
公共共享函数ClosePrinter(hPrinter作为IntPtr)作为布尔值
端函数
_
公共共享功能StartDocPrinter(hPrinter为IntPtr,级别为Int32_
di作为DOCINFOA)作为布尔值
端函数
_
公共共享函数EndDocPrinter(hPrinter作为IntPtr)作为布尔值
端函数
_
公共共享函数StartPagePrinter(hPrinter作为IntPtr)作为布尔值
端函数
_
公共共享函数EndPagePrinter(hPrinter作为IntPtr)作为布尔值
端函数
_
公共共享函数WritePrinter(hPrinter作为IntPtr,pBytes作为IntPtr_
dwCount为Int32,ByRef dwwrite为Int32)为布尔值
端函数
作为新IntPtr的专用hPrinter(0)
私有di作为新的DOCINFOA()
私有PrinterOpen为布尔值=False
公共只读属性PrinterIsOpen为布尔值
得到
PrinterIsOpen=PrinterOpen
结束
端属性
作为布尔值的公共函数OpenPrint(szPrinterName作为字符串)
如果PrinterOpen=False,则
di.pDocName=“.NET原始文档”
di.pDataType=“原始”
如果是OpenPrinter(szPrinterName.Normalize(),hPrinter,IntPtr.Zero),那么
如果启动打印机(hPrinter,1,di),则
如果启动图形打印机(hPrinter),则
PrinterOpen=True
如果结束
如果结束
如果结束
如果结束
OpenPrint=PrinterOpen
端函数
公开分户打印()
如果打印机打开,则
EndPagePrinter(HPPrinter)
EndDocPrinter(HPPrinter)
闭合打印机(hPrinter)
PrinterOpen=False
如果结束
端接头
作为布尔值的公共函数SendStringToPrinter(szPrinterName作为字符串,szString作为字符串)
如果打印机打开,则
将pBytes变暗为IntPtr
Dim dwCount为Int32
Dim DW写入为Int32=0
dwCount=szString.Length
pBytes=Marshal.StringToCoTaskMemAnsi(szString)
SendstringTopPrinter=WritePrinter(hPrinter,PB字节,dwCount,DWWrited)
FreeCoTaskMem元帅(PB字节)
其他的
SendStringToPrinter=False
如果结束
端函数
末级

我能够解决这个问题,对于任何面临这个问题的人来说,以下是有效的代码:

Public Class PrintHelper
    Friend TextToBePrinted As String
    Dim prn As New Printing.PrintDocument

    Public Sub prt(ByVal text As String, ByVal printer As String)
        TextToBePrinted = text
        Using (prn)
            prn.PrinterSettings.PrinterName = printer
            AddHandler prn.PrintPage, _
               AddressOf Me.PrintPageHandler
            prn.Print()
            RemoveHandler prn.PrintPage, _
   AddressOf Me.PrintPageHandler
        End Using
    End Sub

    Private Sub PrintPageHandler(ByVal sender As Object, _
       ByVal args As Printing.PrintPageEventArgs)
        Dim myFont As New Font("Courier New", 9)
        args.Graphics.DrawString(TextToBePrinted, _
           New Font(myFont, FontStyle.Regular), _
           Brushes.Black, 50, 50)
    End Sub
End Class

你对这个主题的搜索揭示了什么?您被困在哪里?问题不清楚:您是要编写使用LPT1打印的打印机驱动程序,还是要编写代码将数据发送到现有的windows打印机驱动程序(通过LPT1打印),还是要绕过windows打印方法直接将数据发送到LPT1?Harald Coppoolse,我需要绕过windows打印方法并将数据直接发送到LPT1I我想指出的是,当使用第二种方法并将打印机设置为xps时,文件将保存为oxps,xps无法打开它