<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Meatball&#039;s Guide to .NET &#187; printing</title>
	<atom:link href="http://rogerpence.com/blog/index.php/archives/category/printing/feed" rel="self" type="application/rss+xml" />
	<link>http://rogerpence.com/blog</link>
	<description>A dogma-free guide to making real-world sense of .NET</description>
	<lastBuildDate>Wed, 23 Jun 2010 16:15:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Getting a list of installed Windows printers</title>
		<link>http://rogerpence.com/blog/index.php/archives/172</link>
		<comments>http://rogerpence.com/blog/index.php/archives/172#comments</comments>
		<pubDate>Wed, 03 Jun 2009 16:57:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[printing]]></category>

		<guid isPermaLink="false">http://rogerpence.com/blog/index.php/archives/172</guid>
		<description><![CDATA[For printing tasks, it’s common to need to fetch the list of currently installed printers on a given PC. The Windows’ PrintDialog does display available printers—but it’s generally intended to be used in the general workflow of printing a document. The PrintDialog is also no help whatsoever for browser-hosted intranet apps where a user needs [...]]]></description>
			<content:encoded><![CDATA[<p>For printing tasks, it’s common to need to fetch the list of currently installed printers on a given PC. The Windows’ PrintDialog does display available printers—but it’s generally intended to be used in the general workflow of printing a document. The PrintDialog is also no help whatsoever for browser-hosted intranet apps where a user needs to select, and then print, to a given network printer. What I wanted was an easy way to show users available printers; and I wanted this technique to work in either Windows or browser clients.</p>
<p>For example, the other day I worked on a task where the requirement was to be able to batch print documents (Word and Excel mostly, but also images). In this case, the PrintDialog wasn’t much help. I wanted to provide an easy way for users to select the target printer without all of the ceremony of the PrintDialog. </p>
<p>To perform this task, I wrote the code shown in Figure 1. It provides two classes: </p>
<ul>
<li><strong>PrinterCommon</strong>. This class provides a GetInstalledPrintersList() method that returns an instance of a class that provides a string array of printer names and an integer value indicating which of the printers in the list is the default printer. (I named this class PrinterCommon because I intend later to add other common print tasks to it.) </li>
<li><strong>InstalledPrinters</strong>. This class is the result type returned from from GetInstalledPrinterList(). While I typically don’t like to put more than one class in a source member, given the tight coupling between PrinterCommon and InstalledPrinters, that seemed like an OK shortcut for this simple task. </li>
</ul>
<div class="sourceCodeHeading">Figure 1. Code to get a list of installed printers.</div>
<div id="Id1230308437SourceCode" class="sourceCode">
<pre class="even"><span class="ln">  1</span><span class="code">using System;</span></pre>
<pre class="odd"><span class="ln">  2</span><span class="code">using System.Drawing.Printing;</span></pre>
<pre class="even"><span class="ln">  3</span><span class="code"></span></pre>
<pre class="odd"><span class="ln">  4</span><span class="code">namespace rp</span></pre>
<pre class="even"><span class="ln">  5</span><span class="code">{</span></pre>
<pre class="odd"><span class="ln">  6</span><span class="code">    /// &lt;summary&gt;</span></pre>
<pre class="even"><span class="ln">  7</span><span class="code">    /// Common print and printer tasks.</span></pre>
<pre class="odd"><span class="ln">  8</span><span class="code">    /// &lt;/summary&gt;</span></pre>
<pre class="even"><span class="ln">  9</span><span class="code">    internal class PrinterCommon</span></pre>
<pre class="odd"><span class="ln"> 10</span><span class="code">    {</span></pre>
<pre class="even"><span class="ln"> 11</span><span class="code">        /// &lt;summary&gt;</span></pre>
<pre class="odd"><span class="ln"> 12</span><span class="code">        /// Get the list of installed printers.</span></pre>
<pre class="even"><span class="ln"> 13</span><span class="code">        /// &lt;/summary&gt;</span></pre>
<pre class="odd"><span class="ln"> 14</span><span class="code">        /// &lt;returns&gt;An instance of InstalledPrinters.&lt;/returns&gt;</span></pre>
<pre class="even"><span class="ln"> 15</span><span class="code">        public static InstalledPrinters GetInstalledPrinterList()</span></pre>
<pre class="odd"><span class="ln"> 16</span><span class="code">        {</span></pre>
<pre class="even"><span class="ln"> 17</span><span class="code">            // Get default printer name.</span></pre>
<pre class="odd"><span class="ln"> 18</span><span class="code">            string currentPrinter = new PrinterSettings().PrinterName;</span></pre>
<pre class="even"><span class="ln"> 19</span><span class="code"></span></pre>
<pre class="odd"><span class="ln"> 20</span><span class="code">            // Declare a string array to store the list of installed printers.</span></pre>
<pre class="even"><span class="ln"> 21</span><span class="code">            var installedPrinters =</span></pre>
<pre class="odd"><span class="ln"> 22</span><span class="code">                new string[ PrinterSettings.InstalledPrinters.Count ];</span></pre>
<pre class="even"><span class="ln"> 23</span><span class="code"></span></pre>
<pre class="odd"><span class="ln"> 24</span><span class="code">            // Copy the list of installed printers into the installedPrinters</span></pre>
<pre class="even"><span class="ln"> 25</span><span class="code">            // array (starting at element zero).</span></pre>
<pre class="odd"><span class="ln"> 26</span><span class="code">            PrinterSettings.InstalledPrinters.CopyTo( installedPrinters, 0 );</span></pre>
<pre class="even"><span class="ln"> 27</span><span class="code"></span></pre>
<pre class="odd"><span class="ln"> 28</span><span class="code">            // Get index of default printer.</span></pre>
<pre class="even"><span class="ln"> 29</span><span class="code">            int i = Array.IndexOf( installedPrinters, currentPrinter );</span></pre>
<pre class="odd"><span class="ln"> 30</span><span class="code"></span></pre>
<pre class="even"><span class="ln"> 31</span><span class="code">            // Return with a new instance of InstalledPrinters.</span></pre>
<pre class="odd"><span class="ln"> 32</span><span class="code">            return new InstalledPrinters() { PrinterNames = installedPrinters, </span></pre>
<pre class="even"><span class="ln"> 33</span><span class="code">                                             SelectedPrinterIndex = i };</span></pre>
<pre class="odd"><span class="ln"> 34</span><span class="code">        }</span></pre>
<pre class="even"><span class="ln"> 35</span><span class="code">    }</span></pre>
<pre class="odd"><span class="ln"> 36</span><span class="code"></span></pre>
<pre class="even"><span class="ln"> 37</span><span class="code">    /// &lt;summary&gt;</span></pre>
<pre class="odd"><span class="ln"> 38</span><span class="code">    /// A simple class used to list the installed printers</span></pre>
<pre class="even"><span class="ln"> 39</span><span class="code">    /// and the index in that list of the default printer.</span></pre>
<pre class="odd"><span class="ln"> 40</span><span class="code">    /// &lt;/summary&gt;</span></pre>
<pre class="even"><span class="ln"> 41</span><span class="code">    class InstalledPrinters</span></pre>
<pre class="odd"><span class="ln"> 42</span><span class="code">    {</span></pre>
<pre class="even"><span class="ln"> 43</span><span class="code">        public string[] PrinterNames { get; set; }</span></pre>
<pre class="odd"><span class="ln"> 44</span><span class="code">        public int SelectedPrinterIndex { get; set; }</span></pre>
<pre class="even"><span class="ln"> 45</span><span class="code">    }</span></pre>
<pre class="odd"><span class="ln"> 46</span><span class="code">}</span></pre>
</div>
<div class="sourceCodeFooter"><a id="Id1230308437SourceCodeToClipboard" class="copyLink" href="javascript:toggleLineNumbers( 'Id1230308437SourceCode' );">Show copy-friendly code</a></div>
<p>The code to use the GetInstalledPrinterList() is very easy; it is shown below in Figure 2. Note that the Item’s AddRange() method is used to assign the array of printer names to the ComboBox (which also works with ListBox). While the code in Figure 2 is specific to Windows, a simple variation of it works just fine with browser-based applications. </p>
<div class="sourceCodeHeading">Figure 2. Using the GetInstalledPrinterList() method</div>
<div id="Id1248109843SourceCode" class="sourceCode">
<pre class="even"><span class="ln">  1</span><span class="code">rp.InstalledPrinters pl = rp.PrinterCommon.GetInstalledPrinterList();</span></pre>
<pre class="odd"><span class="ln">  2</span><span class="code"></span></pre>
<pre class="even"><span class="ln">  3</span><span class="code">comboBox1.Items.AddRange( pl.PrinterNames );</span></pre>
<pre class="odd"><span class="ln">  4</span><span class="code">comboBox1.SelectedIndex = pl.SelectedPrinterIndex;</span></pre>
</div>
<div class="sourceCodeFooter"><a id="Id1248109843SourceCodeToClipboard" class="copyLink" href="javascript:toggleLineNumbers( 'Id1248109843SourceCode' );">Show copy-friendly code</a></div>
]]></content:encoded>
			<wfw:commentRss>http://rogerpence.com/blog/index.php/archives/172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
