現在オフラインです。再接続するためにインターネットの接続を待っています

Visual C# .NET を使用して生データをプリンターに送信する方法

Windows XP のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Windows XP のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:322091
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
Microsoft Visual Basic .NET 版のこの資料には、次を参照してください。 322090.
アンマネージ C++ バージョンをこの資料の次の資料、マイクロソフト サポート技術を参照してください。
138594 Win32 API を使用して生データをプリンターに送信する方法
この資料は、次の Microsoft.NET Framework クラス ライブラリの名前空間を参照します。
  • System.IO
  • System.Drawing.Printing
  • 関連付ける

このタスクでは

概要
この資料では、Visual C# .NET を使用して作成したアプリケーションからの Win32 スプーラー関数を使用する方法について手順を追って説明します。

back to the top

詳細

Microsoft.NET Framework から生データをプリンターに送信するには、プログラムは Win32 スプーラー関数を使用する必要があります。.NET Framework のPrintDocumentPrintController、および関連付けられているクラスを使用して印刷できます。ただしと、.NET Framework のプリンターにプリンター準備完了のフォーマット済みのデータを送信できません。

生データをプリンターに送信するには、次にすることがあります。
  • エスケープ シーケンスを送信します。
  • ダウンロード、およびソフト フォントを使用しています。
  • 印刷ファイルをスプールします。
これらの種類やその他の生データをプリンターに送信するには、コード Win32 スプーラー アプリケーション プログラマ インターフェイス (Api) を使用する必要があります。次のコードは、メモリ内に、書式設定済みのファイルの内容を読むし、し、これらのバイト列をプリンターにWritePrinterを使用して送信する方法を示します。

: ネイティブPrintDocument印刷ジョブの印刷ジョブでこの方法を使用することはできません。印刷または印刷ジョブのバイトを送信する、.NET Framework を使用することもあります。

back to the top

書式付きデータを出力するプロジェクトを作成します。

  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をクリックします。(文字列が、見慣れないコマンドなしで送信されるため、ページを手動でイジェクトする必要があります)
back to the top
関連情報
詳細について、マイクロソフト サポート技術記事を表示するには、次資料番号をクリックします。
138594 Win32 API を使用して生データをプリンターに送信する方法
back to the top
ソフト フォントをダウンロード RAW デバイス ポート

警告: この記事は自動翻訳されています

プロパティ

文書番号:322091 - 最終更新日: 12/07/2015 10:54:22 - リビジョン: 8.0

Microsoft Windows XP Professional

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtja
フィードバック