各位大虾,怎么样获取枚举机器上所有打印机的相关信息(打印机名、IP、型号)?
解决方案 »
- WCF启动服务问题。
- 程序运行后动态加入多个新label控件?
- 依然在问类似问题.通过窗口句柄获取窗口类名,标题等.
- 再开一贴问,怎么将部分SQL语句传入存储过程并执行,急
- XSD绑定到DateGrid.WinForm程序。
- toolbar能和数据绑定吗 我觉得可以 求指点
- 使用SendMessage打开其他程序的窗口,出现各种奇怪问题
- Winform中用checkbox全选和取消选中listbox中所有的选项
- 如何用Repeater控件实现分层循环效果
- C# winform 对xml查询 把符合条件的显示到datagridview里怎么写?
- 数字加密问题,请高手指教,急,在线等!!!
- 去掉office outlook的访问提示框.
using System.Drawing.Printing;
listBox1.Items.Clear();
foreach (string printer in PrinterSettings.InstalledPrinters)
{
listBox1.Items.Add(printer);
}
\\127.0.0.1\aaaaaa型号不好搞,软件获得的信息都是通过的打印机驱动,它没有型号的信息。只能通过打印机名称判断了(但名称可以手工修改,所以不准确)。
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 WinAppTest
{
public partial class PrinterList : Form
{
#region 预定义类型 [FlagsAttribute]
public enum PrinterEnumFlags
{
PRINTER_ENUM_DEFAULT = 0x00000001,
PRINTER_ENUM_LOCAL = 0x00000002,
PRINTER_ENUM_CONNECTIONS = 0x00000004,
PRINTER_ENUM_FAVORITE = 0x00000004,
PRINTER_ENUM_NAME = 0x00000008,
PRINTER_ENUM_REMOTE = 0x00000010,
PRINTER_ENUM_SHARED = 0x00000020,
PRINTER_ENUM_NETWORK = 0x00000040,
PRINTER_ENUM_EXPAND = 0x00004000,
PRINTER_ENUM_CONTAINER = 0x00008000,
PRINTER_ENUM_ICONMASK = 0x00ff0000,
PRINTER_ENUM_ICON1 = 0x00010000,
PRINTER_ENUM_ICON2 = 0x00020000,
PRINTER_ENUM_ICON3 = 0x00040000,
PRINTER_ENUM_ICON4 = 0x00080000,
PRINTER_ENUM_ICON5 = 0x00100000,
PRINTER_ENUM_ICON6 = 0x00200000,
PRINTER_ENUM_ICON7 = 0x00400000,
PRINTER_ENUM_ICON8 = 0x00800000,
PRINTER_ENUM_HIDE = 0x01000000
} [StructLayout(LayoutKind.Sequential)]
public struct PRINTER_INFO_2
{
[MarshalAs(UnmanagedType.LPTStr)]
public string pServerName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPrinterName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pShareName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPortName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDriverName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pComment;
[MarshalAs(UnmanagedType.LPTStr)]
public string pLocation;
public IntPtr pDevMode;
[MarshalAs(UnmanagedType.LPTStr)]
public string pSepFile;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPrintProcessor;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDatatype;
[MarshalAs(UnmanagedType.LPTStr)]
public string pParameters;
public IntPtr pSecurityDescriptor;
public uint Attributes;
public uint Priority;
public uint DefaultPriority;
public uint StartTime;
public uint UntilTime;
public uint Status;
public uint cJobs;
public uint AveragePPM;
} #endregion #region 引用 WindowsAPI
//引用API声明
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumPrinters(
PrinterEnumFlags Flags,
string Name,
uint Level,
IntPtr pPrinterEnum,
uint cbBuf,
ref uint pcbNeeded,
ref uint pcReturned
); #endregion #region 遍历打印机 /// <summary>
/// 遍历打印机
/// </summary>
/// <param name="Flags"></param>
/// <returns></returns>
public static PRINTER_INFO_2[] EnumPrinters(PrinterEnumFlags Flags)
{
PRINTER_INFO_2[] Info2 = null; uint cbNeeded = 0;
uint cReturned = 0; bool ret = EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned);
IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
ret = EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned); if(ret)
{
Info2 = new PRINTER_INFO_2[cReturned];
int offset = pAddr.ToInt32();
for (int i = 0; i < cReturned; i++)
{
Info2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2));
offset += Marshal.SizeOf(typeof(PRINTER_INFO_2));
} Marshal.FreeHGlobal(pAddr);
} return Info2;
} #endregion public PrinterList()
{
InitializeComponent();
} private void PrinterList_Load(object sender, EventArgs e)
{
listBox1.Items.Clear(); foreach (string printer in PrinterSettings.InstalledPrinters)
{
listBox1.Items.Add(printer);
} listBox1.Items.Clear();
PRINTER_INFO_2[] printInfo; printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL); if (printInfo != null && printInfo.Length >= 0)
{
for (int i = 0; i < printInfo.Length; i++)
{
listBox1.Items.Add(safestring(printInfo[i].pServerName));
listBox1.Items.Add(printInfo[i].pShareName);
listBox1.Items.Add(printInfo[i].pPrinterName);
listBox1.Items.Add(printInfo[i].pPortName);
listBox1.Items.Add(printInfo[i].Status);
//Console.WriteLine(printInfo[i].pPrinterName);
}
}
} private string safestring(object s)
{
if (s == null) return "";
return s.ToString();
} }
}
System.Drawing.Printing;
我觉得就没有问题
printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);
中的参数可以查看不同范围内的打印机设置,可以挨个测试
如可以改成
printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS);另外
listBox1.Items.Add(safestring(printInfo[i].pServerName));
listBox1.Items.Add(printInfo[i].pShareName);
listBox1.Items.Add(printInfo[i].pPrinterName);
listBox1.Items.Add(printInfo[i].pPortName);
listBox1.Items.Add(printInfo[i].Status);
还有很多信息没显示,可以根据你的需要显示
如果是检查本地机器的,可以这样:
PrintDocument prtdoc = new PrintDocument();
if (PrinterSettings.InstalledPrinters.Count == 0) //检查有没有安装打印机
strResult = "No printer installed on your machine.";
else if (prtdoc.PrinterSettings.PrinterName == "<no default printer>") //检查有没有设置默认打印机
{
strResult = "Please set one printer as default printer.";
}
else if (!prtdoc.PrinterSettings.IsValid) //检测文档的打印设置是否合法
{
strResult = "Printer Settings is invalid.";
}