[C#]設定預設印表機

  • 11970
  • 0
  • 2011-01-05

[C#]設定預設印表機

 

一、問題描述

如何透過程式取得印表機清單,並且設定預設的印表機

 

二、方法

使用 Windows API : WriteProfileString 設定預設印表機,請參考 MSDN 說明 WriteProfileString Function

	using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Printing;
using System.Runtime.InteropServices;

namespace WindowsFormsPrinter
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(long hwnd, long wMsg, long wParam, string lParam);

        [DllImport("kernel32.dll")]
        static extern bool WriteProfileString(string lpAppName, string lpKeyName, string lpString);

        private const long HWND_BROADCAST = 0xffffL;
        private const long WM_WININICHANGE = 0x1a;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            lbPrinter.SelectionMode = SelectionMode.One;
            PrintersList();
        }

        private void btnSet_Click(object sender, EventArgs e)
        {
            if (lbPrinter.SelectedIndex >= 0)
            {
                SetProfileString(lbPrinter.SelectedItem.ToString());
            }
        }

        /// <summary>
        /// 顯示印表機清單
        /// </summary>
        private void PrintersList()
        {
            foreach (string sPrintName in PrinterSettings.InstalledPrinters)
            {
                this.lbPrinter.Items.Add(sPrintName);
            }
            PrintDocument printDoc = new PrintDocument();
            lbPrinter.SelectedItem = printDoc.DefaultPageSettings.PrinterSettings.PrinterName;
        }

        /// <summary>
        /// 設定預設印表機
        /// </summary>
        /// <param name="sPrintName">印表機名稱</param>
        public void SetProfileString(string sPrintName)
        {
            string DeviceLine = sPrintName + ",,";

            // 使用 WriteProfileString 設定預設印表機
            WriteProfileString("windows", "Device", DeviceLine);

            // 使用 SendMessage 傳送正確的通知給所有最上層的層級視窗。
            // WIN.INI 要在意的應用程式接聽此訊息,並且視需要重新讀取 WIN.ini
            SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows");
        }
    }
}

 

三、範例下載

WindowsFormsPrinter.zip

 

四、相關參考與連結

資訊: 取得/設定預設印表機從 Windows

Setting Windows default printer