Frage

Ich versuche, einen Thermodrucker rohen ascii Daten auszudrucken. Ich tue dies, indem Sie dieses Codebeispiel verwenden: http://support.microsoft.com/kb/322091 aber mein Drucker druckt immer nur ein Zeichen und dies nicht, bis ich die Form Feed Taste drücken. Wenn ich etwas mit Notizblock drucken wird der Drucker eine Formularvorschub automatisch tun, aber ohne Text gedruckt wird.

Der Drucker über USB über einen LPT2USB Adapter und Windows 7 verwendet die verbunden ist. "Generic -> Allgemein / Nur Text" Treiber

Jeder weiß, was falsch läuft? Wie ist es möglich, einige Worte zu drucken und einige Vorschübe tun? Gibt es einige Steuerzeichen I senden? Und wenn ja: Wie sende ich sie

?

Bearbeiten 14.04.2010 21.51

Mein Code (C #) sieht wie folgt aus:

PrinterSettings s =  new PrinterSettings();
s.PrinterName = "Generic / Text Only";

RawPrinterHelper.SendStringToPrinter(s.PrinterName, "Test");

Dieser Code wird ein "T" zurück, nachdem ich die Form Feed Taste gedrückt (Diese litte schwarze Taste hier: swissmania.ch/images/935-151.jpg - sorry, nicht genug Ruf für zwei Hyperlinks)

Bearbeiten 15.04.2010 16.56

Ich verwende jetzt den Code Formular hier: c-sharpcorner.com/UploadFile/johnodonell/PrintingDirectlytothePrinter11222005001207AM/PrintingDirectlytothePrinter.aspx

Ich änderte es ein wenig, dass ich den folgenden Code verwenden:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[1] { 13 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

Ausführen dieses Codes hat die gleiche Effekt wie die Form Feed Taste drücken, es funktioniert gut!

Aber Code wie dies immer noch nicht funktioniert:

byte[] toSend;
// 10 = line feed
// 13 carriage return/form feed
toSend = new byte[2] { 66, 67 };
PrintDirect.WritePrinter(lhPrinter, toSend, toSend.Length, ref pcWritten);

Dies wird auszudrucken nur ein „B“ aber ich erwarte, „BC“ und nach beliebigem Code ausgeführt Ich habe die USB-Kabel zu verbinden, um es agian zu arbeiten. Irgendwelche Ideen?

War es hilfreich?

Lösung 2

Okay, der Grund für all das Zeug ist nur die Tatsache, dass ich einen Adapter verwenden, weil mein Computer nicht ein alt LPT-Port nicht hat. Ich kopierte meine Anwendung auf einen alten Computer mit Windows XP und alles funktioniert.

Jetzt habe ich die Hoffnung, dass einige andere LPT2USB adaters kaufte ich richtig tun ihre Arbeit.

Bearbeiten 20.04.2010

Mit einem weiteren LPT2USB Adapter alles funktioniert jetzt. Wenn jemand in den gesamten Code intersted ist ich jetzt benutze, bitte kontaktieren Sie mich oder Kommentar hier.

Andere Tipps

Schnell Schritt für Schritt Lösung

Da Code nicht zur Verfügung gestellt wurde, mache ich es mit Hilfe der bereitgestellten Links arbeiten, und hier ist der Code:

Code

using System;
using System.Runtime.InteropServices;
using System.Windows;

[StructLayout(LayoutKind.Sequential)]
public struct DOCINFO {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string pDocName;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pOutputFile;
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string pDataType;
}

public class PrintDirect {
    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long StartPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndPagePrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long EndDocPrinter(IntPtr hPrinter);

    [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern long ClosePrinter(IntPtr hPrinter);
}

private void Print(String printerAddress, String text, String documentName) {
    IntPtr printer = new IntPtr();

    // A pointer to a value that receives the number of bytes of data that were written to the printer.
    int pcWritten = 0;

    DOCINFO docInfo = new DOCINFO();
    docInfo.pDocName = documentName;
    docInfo.pDataType = "RAW";

    PrintDirect.OpenPrinter(printerAddress, ref printer, 0);
    PrintDirect.StartDocPrinter(printer, 1, ref docInfo);
    PrintDirect.StartPagePrinter(printer);

    try {
    PrintDirect.WritePrinter(printer, text, text.Length, ref pcWritten);
    } catch (Exception e) {
        Console.WriteLine(e.Message);
    }

    PrintDirect.EndPagePrinter(printer);
    PrintDirect.EndDocPrinter(printer);
    PrintDirect.ClosePrinter(printer);
}

Verwendung

String printerAddress = "\\\\ComputerName\\PrinterName";
String documentName = "My document";
String documentText = "This is an example of printing directly to a printer.";

this.Print (printerAddress, Documenttext, document);

Quellen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top