Winforms 从Windows应用程序打印到LPT1端口
我正在VS2015上构建一个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
谢谢我尝试应用以下代码,但没有打印任何内容:
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无法打开它