「通常使うプリンタ」に指定されているプリンタ名は、新しくPrintDocumentオブジェクトを作成し、そのPrinterSettings.PrinterNameプロパティを調べれば分かります。次のような感じです。
'PrintDocumentの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'プリンタ名の取得 Dim defaultPrinterName As String = pd.PrinterSettings.PrinterName '結果を表示 Console.WriteLine("通常使うプリンタは " + defaultPrinterName + " です。")
//PrintDocumentの作成 System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument(); //プリンタ名の取得 string defaultPrinterName = pd.PrinterSettings.PrinterName; //結果を表示 Console.WriteLine( "通常使うプリンタは " + defaultPrinterName + " です。");
また、WMIのWin32_Printerを使用してプリンタを列挙し、デフォルトのプリンタを調べることもできます。以下のコードを実行するには、参照設定に"System.Management"を追加する必要があります。Defaultプロパティで調べれば簡単ですが、これはWindows NT 4.0と2000でサポートしていないため、Attributesプロパティで調べています。
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()
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を使用した方法を紹介します。ただしこの方法はWindows XP以上でしか使用できません。先ほどの例と同様、参照に"System.Management"を追加する必要があります。
''' <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
/// <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のWshNetworkオブジェクトのSetDefaultPrinter メソッドを使う方法もあります。WshNetworkオブジェクトのSetDefaultPrinterメソッドを呼び出すには、次のようにします。
''' <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
/// <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}); }
上記で紹介した方法以外に、通常使うプリンタを取得するためにGetDefaultPrinter、GetProfileString、GetPrinter関数を、通常使うプリンタを設定するためにSetDefaultPrinter、WriteProfileString、SetPrinter関数を使用するという方法もあります。これらの関数に関しては、「[HOWTO] Windows の通常使うプリンタを取得および設定する方法」をご覧ください。
GetPrinter関数に関しては、「プリンタのポート、状態を取得する」でその使用法を紹介しています。ただしこの方法で通常使うプリンタが取得できるのは、Windows95、98、Meのみです。
(この記事は、「.NETプログラミング研究 第47号」で紹介したものを基にしています。)