最近在论坛中不少网友问"如何把Windows安装的所有打印机列出来",在下面的程序中我们将把系统中所安装的打印机用列表框列出来,同时为默认打印机设置缺省值。 

  在下面的程序中我们用到了两个主要的类,把所有的打印机列表出来用到了PrinterSettings 类,获取系统默认打印机用到了PrintDocument 类,下面我们就动手实践一下吧。 

  先新建一个windows form的工程,然后加入一个lable和一个comBox,就行啦,关键在下面啦,我们如何获得默认打印机,就得用下面的语句。 

PrintDocument prtdoc = new PrintDocument(); 
string strDefaultPrinter = prtdoc.PrinterSettings.PrinterName;//获取默认的打印机名 

  有了默认的打印机,我们再把所有的打印机列出来。 

  PrinterSettings类有一个InstalledPrinters的属性,不知是做什么的吧,查MSDN如下解释: 
PrinterSettings.InstalledPrinters 获取安装在计算机上所有打印机的名称。 

  在C#中如下定义: 

[C#] 
 [Serializable] 
 [ComVisible(false)] 
 public static PrinterSettings.StringCollection InstalledPrinters 
 {get;}

  属性值 

  PrinterSettings.StringCollection,它表示安装在计算机上所有打印机的名称。 

  异常 

异常类型 条件 
Win32Exception 未能枚举可用的打印机 

  备注 

  可以使用已安装的打印机名称的集合向用户提供要打印到的打印机选择。 

  下面的示例用已安装的打印机填充 comboInstalledPrinters 组合框,并且还在选择更改时使用 PrinterName 属性设置用于打印的打印机。PopulateInstalledPrintersCombo 例程在窗体初始化时被调用。该示例假定存在名为 printDoc 的 PrintDocument 变量,并且存在特定的组合框。 

[C#] 
 //下面括号内的自己翻译添加进去的 
 private void PopulateInstalledPrintersCombo() 
 { 
 // Add list of installed printers found to the combo box.(将系统中所有的打机加入列表框) 
 // The pkInstalledPrinters string will be used to provide the display string.(列表框中显示的字串由pkInstalledPrinters提供) 
 foreach(String pkInstalledPrinters in 
 PrinterSettings.InstalledPrinters) 
 { 
 comboInstalledPrinters.Items.Add(pkInstalledPrinters); 
 } 
 } private void comboInstalledPrinters_SelectionChanged(object sender, System.EventArgs e) 
 { // Set the printer to a printer in the combo box when the selection changes.(当列表框改变时设置选择的打印机) 
if (comboInstalledPrinters.SelectedIndex != -1) 
 { 
 // The combo box's Text property returns the selected item's text, which is the printer name.(将选择的打印机名在列表框中显示) 
 printDoc.PrinterSettings.PrinterName= comboInstalledPrinters.Text; 
 } }

  看了MSDN的说明,懂多了吧,下面是我写练习完整代码. 

//程序说明:将系统中的所有打印机在列表框中列出 
 //程序变量: PrintDocument prtdoc、string strDefaultPrinter 
 //编写人:蚕蛹(sillnet@163.net) 
 //日期:2003-03-20 
 using System; 
 using System.Drawing; 
 using System.Drawing.Printing; 
 using System.Collections; 
 using System.ComponentModel; 
 using System.Windows.Forms; 
 using System.Data; namespace PrinterList 
 { 
  /// 
  /// Form1 的摘要说明。 
  /// 
  public class Form1 : System.Windows.Forms.Form 
  { 
   private System.Windows.Forms.Label label1; 
   private System.Windows.Forms.ComboBox printerList; 
   /// 
   /// 必需的设计器变量。 
   /// 
   private System.ComponentModel.Container components = null;   public Form1() 
   { 
    // 
    // Windows 窗体设计器支持所必需的 
    // 
    InitializeComponent(); 
    PrintDocument prtdoc = new PrintDocument(); 
    string strDefaultPrinter = prtdoc.PrinterSettings.PrinterName;//获取默认的打印机名 
    foreach(String strPrinter in PrinterSettings.InstalledPrinters) 
    //在列表框中列出所有的打印机, 
    {  
     printerList.Items.Add(strPrinter); 
     if (strPrinter == strDefaultPrinter)//把默认打印机设为缺省值 
     { 
      printerList.SelectedIndex = printerList.Items.IndexOf(strPrinter); 
     } 
    } 
    // 
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 
    // 
   }   /// 
   /// 清理所有正在使用的资源。 
   /// 
   protected override void Dispose( bool disposing ) 
   { 
    if( disposing ) 
    { 
     if (components != null) 
     { 
      components.Dispose(); 
     } 
    } 
    base.Dispose( disposing ); 
   }   #region Windows Form Designer generated code 
   /// 
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
   /// 此方法的内容。 
   /// 
   private void InitializeComponent() 
   { 
    this.label1 = new System.Windows.Forms.Label(); 
    this.printerList = new System.Windows.Forms.ComboBox(); 
    this.SuspendLayout(); 
   // 
   // label1 
    // 
    this.label1.Location = new System.Drawing.Point(8, 24); 
     = "label1"; 
    this.label1.Size = new System.Drawing.Size(72, 16); 
    this.label1.TabIndex = 0; 
    this.label1.Text = "选择打印机:"; 
    // 
    // printerList 
    // 
    this.printerList.Location = new System.Drawing.Point(88, 22); 
     = "printerList"; 
    this.printerList.Size = new System.Drawing.Size(192, 21); 
    this.printerList.TabIndex = 1; 
    this.printerList.Text = "当前系统未装打印机"; 
    // 
    // Form1 
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); 
    this.ClientSize = new System.Drawing.Size(288, 61); 
    this.Controls.AddRange(new System.Windows.Forms.Control[] { 
       this.printerList, 
       this.label1}); 
     = "Form1"; 
    this.Text = "打印机列表"; 
    this.ResumeLayout(false);   } 
   #endregion   /// 
   /// 应用程序的主入口点。 
   /// 
   [STAThread] 
   static void Main() 
   { 
    Application.Run(new Form1()); 
   }  } 
 }

以上代码在windows xp + 下测试通过,编译后在Windows98上测试通过