DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

通常使うプリンタを取得、設定する

通常使うプリンタを取得する

PrinterSettings.PrinterNameプロパティを調べる方法

「通常使うプリンタ」に指定されているプリンタ名は、新しくPrintDocumentオブジェクトを作成し、そのPrinterSettings.PrinterNameプロパティを調べれば分かります。次のような感じです。

VB.NET
コードを隠すコードを選択
'PrintDocumentの作成
Dim pd As New System.Drawing.Printing.PrintDocument
'プリンタ名の取得
Dim defaultPrinterName As String = pd.PrinterSettings.PrinterName
'結果を表示
Console.WriteLine("通常使うプリンタは " +
    defaultPrinterName + " です。")
C#
コードを隠すコードを選択
//PrintDocumentの作成
System.Drawing.Printing.PrintDocument pd =
    new System.Drawing.Printing.PrintDocument();
//プリンタ名の取得
string defaultPrinterName = pd.PrinterSettings.PrinterName;
//結果を表示
Console.WriteLine(
    "通常使うプリンタは " + defaultPrinterName + " です。");

WMIを使用する方法

また、WMIのWin32_Printerを使用してプリンタを列挙し、デフォルトのプリンタを調べることもできます。以下のコードを実行するには、参照設定に"System.Management"を追加する必要があります。Defaultプロパティで調べれば簡単ですが、これはWindows NT 4.0と2000でサポートしていないため、Attributesプロパティで調べています。

VB.NET
コードを隠すコードを選択
Dim mos As New System.Management.ManagementObjectSearcher( _
    "Select * from Win32_Printer")
Dim moc As System.Management.ManagementObjectCollection = mos.Get()

'プリンタを列挙する
Dim mo As System.Management.ManagementObject
For Each mo In moc
    'デフォルトのプリンタか調べる
    'mo("Default")はWindows NT 4.0, 2000で使用できません
    Dim attr As Long = Convert.ToInt64(mo("Attributes"))
    If (attr And 4) = 4 Then
        Console.WriteLine(("通常使うプリンタは " + _
            mo("Name").ToString() + " です。"))
        mo.Dispose()
        Exit For
    End If
    mo.Dispose()
Next mo

moc.Dispose()
mos.Dispose()
C#
コードを隠すコードを選択
System.Management.ManagementObjectSearcher mos =
    new System.Management.ManagementObjectSearcher(
        "Select * from Win32_Printer");
System.Management.ManagementObjectCollection moc = mos.Get();

//プリンタを列挙する
foreach (System.Management.ManagementObject mo in moc)
{
    //デフォルトのプリンタか調べる
    //mo["Default"]はWindows NT 4.0, 2000で使用できません
    if ((((uint)mo["Attributes"]) & 4) == 4)
    {
        Console.WriteLine(
            "通常使うプリンタは " + mo["Name"] + " です。");
        mo.Dispose();
        break;
    }
    mo.Dispose();
}

moc.Dispose();
mos.Dispose();

通常使うプリンタを設定する

次に「通常使うプリンタ」を設定する方法を紹介します。

WMIを使用する方法

まず、WMIを使用した方法を紹介します。ただしこの方法はWindows XP以上でしか使用できません。先ほどの例と同様、参照に"System.Management"を追加する必要があります。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 「通常使うプリンタ」に設定する
''' </summary>
''' <param name="printerName">プリンタ名</param>
Public Sub SetDefaultPrinter(ByVal printerName As String)
    Dim mos As New System.Management.ManagementObjectSearcher( _
        "Select * from Win32_Printer")
    Dim moc As System.Management.ManagementObjectCollection = _
        mos.Get()

    'プリンタを列挙する
    Dim mo As System.Management.ManagementObject
    For Each mo In moc
        If CStr(mo("Name")) = printerName Then
            '名前を見つけたとき、デフォルトプリンタに設定する
            Dim mbo As System.Management.ManagementBaseObject = _
                mo.InvokeMethod("SetDefaultPrinter", Nothing, Nothing)
            Dim ret As Long = Convert.ToInt64(mbo("returnValue"))
            If ret <> 0 Then
                Throw New Exception("失敗しました。")
            End If
        End If
    Next mo
End Sub
C#
コードを隠すコードを選択
/// <summary>
/// 「通常使うプリンタ」に設定する
/// </summary>
/// <param name="printerName">プリンタ名</param>
public void SetDefaultPrinter(string printerName)
{
    System.Management.ManagementObjectSearcher mos =
        new System.Management.ManagementObjectSearcher(
        "Select * from Win32_Printer");
    System.Management.ManagementObjectCollection moc =
        mos.Get();

    //プリンタを列挙する
    foreach(System.Management.ManagementObject mo in moc)
    {
        if (((string) mo["Name"]) == printerName)
        {
            //名前を見つけたとき、デフォルトプリンタに設定する
            System.Management.ManagementBaseObject mbo =
                mo.InvokeMethod("SetDefaultPrinter", null, null);
            if (((uint) mbo["returnValue"]) != 0)
                throw new Exception("失敗しました。");
        }
    }
}

Windows Scripting Hostを使用する方法

また、Windows Scripting HostのWshNetworkオブジェクトのSetDefaultPrinter メソッドを使う方法もあります。WshNetworkオブジェクトのSetDefaultPrinterメソッドを呼び出すには、次のようにします。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 「通常使うプリンタ」に設定する
''' </summary>
''' <param name="printerName">プリンタ名</param>
Public Sub SetDefaultPrinter(ByVal printerName As String)
    'WshNetworkオブジェクトを作成する
    Dim t As Type = Type.GetTypeFromProgID("WScript.Network")
    Dim wshNetwork As Object = Activator.CreateInstance(t)
    'SetDefaultPrinterメソッドを呼び出す
    t.InvokeMember("SetDefaultPrinter", _
        System.Reflection.BindingFlags.InvokeMethod, _
        Nothing, wshNetwork, New Object() {printerName})
End Sub
C#
コードを隠すコードを選択
/// <summary>
/// 「通常使うプリンタ」に設定する
/// </summary>
/// <param name="printerName">プリンタ名</param>
public void SetDefaultPrinter(string printerName)
{
    //WshNetworkオブジェクトを作成する
    Type t = Type.GetTypeFromProgID("WScript.Network");
    object wshNetwork = Activator.CreateInstance(t);
    //SetDefaultPrinterメソッドを呼び出す
    t.InvokeMember("SetDefaultPrinter",
        System.Reflection.BindingFlags.InvokeMethod,
        null, wshNetwork, new object[] {printerName});
}

Win32 APIを使用する方法

上記で紹介した方法以外に、通常使うプリンタを取得するためにGetDefaultPrinterGetProfileStringGetPrinter関数を、通常使うプリンタを設定するためにSetDefaultPrinterWriteProfileStringSetPrinter関数を使用するという方法もあります。これらの関数に関しては、「[HOWTO] Windows の通常使うプリンタを取得および設定する方法」をご覧ください。

GetPrinter関数に関しては、「プリンタのポート、状態を取得する」でその使用法を紹介しています。ただしこの方法で通常使うプリンタが取得できるのは、Windows95、98、Meのみです。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。