Nezpracovaná data odeslání do tiskárny pomocí aplikace Visual C# .NET

Podpora Windows XP byla ukončena.

Společnost Microsoft ukončila dne 8. dubna 2014 podporu Windows XP. Tato změna ovlivnila aktualizace softwaru a možnosti zabezpečení. Další informace o tom, co to pro vás znamená a jak zajistit ochranu.

DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.

Projděte si také anglickou verzi článku: 322091
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Microsoft Visual Basic .NET verzi tohoto článku naleznete v tématu 322090.
Pro nespravovaným C++ verzi tohoto článku naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
138594 Jak odeslat nezpracovaných dat do tiskárny pomocí rozhraní API systému Win32
Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

V TOMTO ÚKOLU

Souhrn
Tento článek ukazuje, jak použít funkce zařazování Win32 z programu, který můžete vytvořit pomocí aplikace Visual C# .NET.

back to the top

Další informace

Nezpracovaná data odeslat do tiskárny z Microsoft rozhraní.NET Framework, aplikace musí pracovat funkce zařazování Win32. Prostřednictvím rozhraní.NET Framework můžete vytisknout pomocí Dokument PrintDocument, PrintControllera přidružených tříd. Pomocí rozhraní.NET Framework, však nelze odeslat předem formátovaných dat tiskárna připravena k tiskárně.

Budete muset poslat nezpracovaná data do tiskárny, proveďte následující kroky:
  • Odeslání sekvence escape.
  • Stáhněte a potom použít písma.
  • Soubory zařazování předtištěných formulářích.
Pokud chcete odeslat tyto typy a jiné druhy nezpracovaná data tiskárny, váš kód musí pracovat s Win32 zařazování programátora rozhraní API (Application). Následující kód ukazuje, jak načíst do paměti obsah předem formátovaných souborů a bajtů, potom odeslat do tiskárny pomocí WritePrinter.

Poznámka: Tento postup nelze použít v stejnou tiskovou úlohu jako původní Dokument PrintDocument tiskovou úlohu. Chcete-li vytisknout nebo odeslat vlastní tiskovou úlohu bajtů je nutné použít rozhraní.NET Framework.

back to the top

Vytvořit projekt, který vytiskne předem formátovaných dat

  1. Spusťte aplikaci Visual Studio .NET. V nabídce soubor klepněte na příkaz Novýa klepněte na příkaz projekt. Ve skupinovém rámečku Typy projektůklikněte na složku Projekty Visual C# . V seznamu šablony klepněte na tlačítko Aplikace systému Windowsa klepněte na tlačítko OK. Ve výchozím nastavení je vytvořen formulář Form1.
  2. V nabídce Zobrazit klepněte na příkaz Zobrazit panel nástrojů a pak přidejte tlačítko do formuláře Form1. Toto tlačítko je s názvem Button1.
  3. Přidání dalšího tlačítka do Form1. Klepnutím na toto tlačítko se nazývá Button2.
  4. Poklepejte na Button1. Zobrazí se okno kód pro formulář.
  5. Podprogram Button1_Click nahraďte následující kód:
    private void button1_Click(object sender, System.EventArgs e){    // Allow the user to select a file.    OpenFileDialog ofd = new OpenFileDialog();    if( DialogResult.OK == ofd.ShowDialog(this) )    {        // Allow the user to select a printer.        PrintDialog pd  = new PrintDialog();        pd.PrinterSettings = new PrinterSettings();        if( DialogResult.OK == pd.ShowDialog(this) )        {            // Print the file to the printer.            RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);        }    }}					
  6. Podprogram Button2_Click nahraďte následující kód:
    private void button2_Click(object sender, System.EventArgs e){    string s = "Hello"; // device-dependent string, need a FormFeed?        // Allow the user to select a printer.    PrintDialog pd  = new PrintDialog();    pd.PrinterSettings = new PrinterSettings();    if( DialogResult.OK == pd.ShowDialog(this) )    {        // Send a printer-specific to the printer.        RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);    }}					
  7. Vložte následující kód v horní části souboru:
    using System;using System.Drawing;using System.Drawing.Printing;using System.Windows.Forms;using System.Runtime.InteropServices;					
  8. Přidejte následující kód uvnitř oboru názvů hlavní aplikaci, ale mimo všechny definice tříd:
    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.        SendBytesToPrinter(szPrinterName, pBytes, dwCount);        Marshal.FreeCoTaskMem(pBytes);        return true;    }}					
  9. Stisknutím klávesy F5 sestavit a spustit program.
  10. Klepněte na tlačítko Button1 načíst a vytisknout obsah do souboru.
  11. Klepněte na tlačítko Button2 tisk řetězec. (Pravděpodobně vysunutí stránky ručně, protože řetězec je odeslán bez formfeed příkazu.)
back to the top
Odkazy
Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
138594 Jak odeslat nezpracovaných dat do tiskárny pomocí rozhraní API systému Win32
back to the top
SUROVÝ zařízení portu ke stažení písma

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 322091 - Poslední kontrola: 12/07/2015 10:54:17 - Revize: 8.0

Microsoft Windows XP Professional

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtcs
Váš názor