[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");
}
}
}
三、範例下載