2009-02-12 11 views
6

Wie drucken Sie direkt auf einem Nadeldrucker in C# mit der Datei LPT1.Drucken an LPT1 in C#

Ich habe es auf C++ mit fopen, aber ich weiß nicht, wie es in C# zu tun.

vielen Dank

+0

Ich habe eine Antwort, aber mein Name ist nicht Michael – geofftnz

+0

Meine Vermutung ist, er kopierte es aus einer E-Mail, die er an jemanden mit der gleichen Frage schickte, nur vergessen, seinen Namen herauszunehmen. – M4dRefluX

+0

Geeze ... Nadeldrucker werden noch verwendet? Ich erinnere mich daran, dass ich bis 1992 programmiert habe, aber ich habe seit Jahren nicht einmal eines gesehen. – abelenky

Antwort

14

Nur den Drucker in Windows als Generic/Text einrichten, dann drucken.

Hier ist der Code, den ich verwende, um auf einem Etikettendrucker zu drucken, der sein eigenes kodiertes Textformat hat.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing; 
using System.Drawing.Printing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.IO; 

namespace whatever { 

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. 
     bool success = SendBytesToPrinter(szPrinterName, pBytes, dwCount); 
     Marshal.FreeCoTaskMem(pBytes); 
     return success; 
    } 
} 
} 

Dann wird diese von einer anderen Klasse wie folgt aufgerufen:

private bool PrintLabels(string printerName) 
    { 
     return RawPrinterHelper.SendStringToPrinter(printerName, this.Text); 
    } 

(edit: wenn jemand irgendwelche großen fubars auf nicht verwalteten Ressourcen im Zusammenhang sieht, lassen Sie mich in den Kommentaren wissen)

+0

Mann, Michael ist so toll. –

+0

Gute Arbeit, Michael! Wie wäre es mit einem Date? ; P – strager

+0

brb Namen Michael ändern ... – geofftnz

1

Vielleicht Sie können nicht auf das Gerät "LPT1" drucken, sondern auf einen "dummen Fernschreiber", den Sie zuerst installieren müssen. Wenn sie in modernen Fenstern existieren .... So sollten Sie auf "Mydumbprinter" drucken, die wiederum LPT1 als Druckeranschluss verwendet. Es erschien mir, als ich dem Source-Link von Cocowalla oben folgte - dort wählen Sie einen Drucker in einem PrinterDialog. Der resultierende Druckername wäre eher "Laserjet" als "LPT1".

0

In C# ist es möglich, zuerst müssen Sie mit diesem Port verbinden mit der CreateFile Methode dann öffnen Sie einen Filestream zu diesem Port, um schließlich zu schreiben. Hier ist eine Beispielklasse, die zwei Zeilen an den Drucker unter LPT1 schreibt.

using Microsoft.Win32.SafeHandles; 
using System; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace YourNamespace 
{ 
public static class Print2LPT 
     { 
      [DllImport("kernel32.dll", SetLastError = true)] 
      static extern SafeFileHandle CreateFile(string lpFileName, FileAccess dwDesiredAccess,uint dwShareMode, IntPtr lpSecurityAttributes, FileMode dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); 

      public static bool Print() 
      { 
       string nl = Convert.ToChar(13).ToString() + Convert.ToChar(10).ToString(); 
       bool IsConnected= false; 

       string sampleText ="Hello World!" + nl + 
       "Enjoy Printing...";  
       try 
       { 
        Byte[] buffer = new byte[sampleText.Length]; 
        buffer = System.Text.Encoding.ASCII.GetBytes(sampleText); 

        SafeFileHandle fh = CreateFile("LPT1:", FileAccess.Write, 0, IntPtr.Zero, FileMode.OpenOrCreate, 0, IntPtr.Zero); 
        if (!fh.IsInvalid) 
        { 
         IsConnected= true;      
         FileStream lpt1 = new FileStream(fh,FileAccess.ReadWrite); 
         lpt1.Write(buffer, 0, buffer.Length); 
         lpt1.Close(); 
        } 

       } 
       catch (Exception ex) 
       { 
        string message = ex.Message; 
       } 

       return IsConnected; 
      } 
     } 
} 

Vorausgesetzt, dass der Drucker auf dem LPT1 Port angeschlossen sind, wenn nicht müssen Sie die CreateFile Verfahren einzustellen, um den Anschluss passen Sie verwenden.

können Sie die Methode überall in Ihrem Programm mit der folgenden Zeile

Print2LPT.Print(); 

Ich denke, nennen dies die kürzeste und effizienteste Lösung für Ihr Problem ist.