Τρόπος αποστολής ανεπεξέργαστα δεδομένα σε έναν εκτυπωτή χρησιμοποιώντας Visual C#.NET

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 322091 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Αυτό το άρθρο βήμα προς βήμα δείχνει πώς να χρησιμοποιήσετε συναρτήσεις spooler Win32 από ένα πρόγραμμα που δημιουργείτε χρησιμοποιώντας Visual C#.NET.

Περισσότερες πληροφορίες

Για να στείλετε ανεπεξέργαστα δεδομένα σε έναν εκτυπωτή από τη Microsoft.NET Framework, το πρόγραμμα πρέπει να εργαστείτε με τις συναρτήσεις ουράς εκτύπωσης Win32. Μέσω του.NET Framework, μπορείτε να εκτυπώσετε χρησιμοποιώντας PrintDocument, PrintController, και τις σχετικές κατηγορίες. Ωστόσο, με το.NET Framework, δεν μπορείτε να στείλετε προ-μορφοποιημένων δεδομένων έτοιμο εκτυπωτή σε εκτυπωτή.

Ίσως χρειαστεί να στείλετε ανεπεξέργαστα δεδομένα σε έναν εκτυπωτή να κάνετε τα εξής:
  • Στείλτε τις ακολουθίες χαρακτήρων escape.
  • Κάντε λήψη και στη συνέχεια χρησιμοποιήστε γραμματοσειρές που φορτώνονται.
  • Τα αρχεία εκτύπωσης σε ουρά εκ των προτέρων τυπωμένο.
Για να στείλετε αυτούς τους τύπους και άλλους τύπους δεδομένων σε έναν εκτυπωτή, του κώδικα πρέπει να λειτουργούν με διασυνδέσεις προγραμματιστή εφαρμογών Win32 ουράς (API). Ο ακόλουθος κώδικας εμφανίζει τον τρόπο ανάγνωσης των περιεχομένων του προ-αρχείο στη μνήμη και στη συνέχεια αποστολή των byte στον εκτυπωτή, χρησιμοποιώντας WritePrinter.

ΣΗΜΕΊΩΣΗ: Δεν είναι δυνατή μπορείτε να χρησιμοποιήσετε αυτήν την προσέγγιση στην ίδια εργασία εκτύπωσης ως μια εγγενή PrintDocument η εργασία εκτύπωσης. Πρέπει να χρησιμοποιήσετε είτε το.NET Framework να εκτυπώσετε ή να στείλετε τη δική σας εργασία εκτύπωσης bytes.

Δημιουργία έργου που εκτυπώνει προ-μορφοποιημένων δεδομένων

  1. Ξεκινήστε το Visual Studio.NET. Από το Το αρχείο μενού, κάντε κλικ στο κουμπί Νέα, και στη συνέχεια κάντε κλικ στο κουμπί Έργο. Στην περιοχή Τύποι έργου, κάντε κλικ στην επιλογή του Έργα Visual C# ο φάκελος. Από το Πρότυπα λίστα, κάντε κλικ στο κουμπί Εφαρμογή των Windows, και στη συνέχεια κάντε κλικ στο κουμπί OK. Από προεπιλογή, δημιουργείται η φόρμα Form1.
  2. Από το Προβολή μενού, κάντε κλικ στο κουμπί Εργαλειοθήκη Για να εμφανίσετε την εργαλειοθήκη και στη συνέχεια προσθέστε ένα κουμπί Για να Form1. Αυτό το κουμπί ονομάζεται Button1.
  3. Προσθέστε μια άλλη κουμπί Για να Form1. Αυτό το κουμπί ονομάζεται Button2.
  4. Κάντε διπλό κλικ Button1. Εμφανίζεται το παράθυρο κώδικα της φόρμας.
  5. Αντικαταστήστε το Button1_Click υπορουτίνα με τον ακόλουθο κώδικα:
    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. Αντικαταστήστε το Button2_Click υπορουτίνα με τον ακόλουθο κώδικα:
    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. Εισαγάγετε τον ακόλουθο κώδικα στο επάνω μέρος του αρχείου:
    using System;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    					
  8. Προσθέστε τον ακόλουθο κώδικα μέσα στο χώρο ονομάτων κύρια εφαρμογή αλλά εκτός ορισμούς κλάσης:
    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. Πατήστε F5 για να δημιουργήσετε και στη συνέχεια εκτελέστε το πρόγραμμα.
  10. Κάντε κλικ στο κουμπί Button1 Για να φορτώσετε και να εκτυπώσετε τα περιεχόμενα του αρχείου.
  11. Κάντε κλικ στο κουμπί Button2 Για να εκτυπώσετε μια συμβολοσειρά. (Ίσως χρειαστεί να αφαιρέσετε με μη αυτόματο τρόπο τη σελίδα επειδή η ακολουθία χαρακτήρων αποστέλλεται χωρίς την αλλαγής σελίδας εντολή).

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
138594Τρόπος αποστολής ανεπεξέργαστα δεδομένα σε έναν εκτυπωτή χρησιμοποιώντας το API του Win32

Ιδιότητες

Αναγν. άρθρου: 322091 - Τελευταία αναθεώρηση: Κυριακή, 29 Μαΐου 2011 - Αναθεώρηση: 4.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Windows XP Professional
Λέξεις-κλειδιά: 
kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:322091

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com