怎么样获取枚举机器上所有打印机的相关信息(打印机名、IP、型号)

aiyq 2009-06-12 10:39:19
各位大虾,怎么样获取枚举机器上所有打印机的相关信息(打印机名、IP、型号)?
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ject8888 2009-09-08
  • 打赏
  • 举报
回复
短信打印机能接收短信并且自动打印,该设备集短信接收功能和打印功能于一身,接收到短信后不用任何操作,即刻自动打印出来,使用该设备需要插入一张SIM卡,即普通的手机卡,(目前只支持GSM卡,不支持CDMA卡),接上电源后该设备即可接收短信并且自动打印出来。每次打印70个汉字或者140个英文字符,超长短信自动分割打印。联系QQ:5378078 TEL:13535879900 联系人:凌先生
lovvver 2009-06-12
  • 打赏
  • 举报
回复
这个需要使用ManagementObjectSearcher。
如果是检查本地机器的,可以这样:


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.";
}
郭大侠_ 2009-06-12
  • 打赏
  • 举报
回复
通过改变
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);
还有很多信息没显示,可以根据你的需要显示
crazyleo814 2009-06-12
  • 打赏
  • 举报
回复
有这个命名空间
System.Drawing.Printing;
我觉得就没有问题
郭大侠_ 2009-06-12
  • 打赏
  • 举报
回复
这是一个form的代码,你在form上加一个list就能运行,能获取打印机的所有信息

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 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();
}

}
}
fengrx 2009-06-12
  • 打赏
  • 举报
回复
名称楼上已经说了。

IP对于本机的就没有了,对于网络打印机取名称的前几个字符串,形式一般如下:
\\127.0.0.1\aaaaaa

型号不好搞,软件获得的信息都是通过的打印机驱动,它没有型号的信息。只能通过打印机名称判断了(但名称可以手工修改,所以不准确)。
郭大侠_ 2009-06-12
  • 打赏
  • 举报
回复

using System.Drawing.Printing;


listBox1.Items.Clear();
foreach (string printer in PrinterSettings.InstalledPrinters)
{
listBox1.Items.Add(printer);
}
jinlingoo1 2009-06-12
  • 打赏
  • 举报
回复
企盼高手中....UP
biny237 2009-06-12
  • 打赏
  • 举报
回复
学习。。。
  • 打赏
  • 举报
回复
没做过哎,mark
获取硬件信息的控件,支持delphi10.3 rio TMiTeC_SystemInfo将以下所有组件收集在一起,以方便使用 TMiTeC_AD探索ActiveDirectory TMiTeC_APM提供有关高级电源管理的信息 TMiTeC_BT使用本机蓝牙枚举器检测蓝牙设备) TMiTeC_CPU提供详细的CPU信息 TMiTeC_Devices提供Windows设备管理器之类的设备信息 TMiTeC_Disk提供逻辑驱动器信息 TMiTeC_Display提供显示适配器信息 TMiTeC_DMA提供直接的内存访问权限 TMiTeC_DriveContent扫描并保存指定的驱动器内容 TMiTeC_Engines提供有关各种已安装引擎的信息 TMiTeC_EventLog从Windows EventLog中提取信息 TMiTeC_Firewall枚举Windows防火墙中的设置和规则,规则管理功能 TMiTeC_Machine提供有关计算机或虚拟机,BIOS,TPM等的信息。 TMiTeC_Media提供媒体设备信息 TMiTeC_Memory提供内存信息 TMiTeC_Monitor提供所有已连接的监视器信息 TMiTeC_MSProduct检测到已安装的某些Microsoft产品及其产品密钥 TMiTeC_MUS检测可用的Windows更新(MicrosoftUpdateSession) TMiTeC_Network提供网卡信息,TCP / IP广告Winsock配置,已安装的协议,客户端和服务。 TMiTeC_OperatingSystem提供OS详细信息,区域设置,时区,NT特定信息,修补程序,Internet设置等。 TMiTeC_Printers检测已安装的打印机及其属性 TMiTeC_ProcessList收集正在运行的进程,服务,驱动程序和窗口及其属性的列表 TMiTeC_Security检测已安装的防病毒,防间谍软件和防火墙 TMiTeC_SMBIOS从内存中读取SMBIOS信息 TMiTeC_Software提供已安装软件的列表 TMiTeC_Startup提供在系统启动期间启动的应用程序的列表 TMiTeC_Storage可检测S-ATA,ATA,ATAPI,RAID,SCSI,USB,Firewire存储设备及其参数 TMiTeC_USB检测USB端口和设备及其参数 TMiTeC_WIFI会检测所有可用参数的可用Wi-Fi网络 每当将任何USB,火线等设备或卷连接到计算机或与计算机断开连接时,TMiTeC_DeviceMonitor都会检测并触发事件。 TMiTeC_DiskMonitor监视指定的驱动器或路径,并在发生指定事件时触发事件 TProcMonThread 通过其进程IDentifier监视给定的进程,并提供基本的进程属性,内存,CPU和I / O进程使用率,并枚举进程线程及其运行时属性。 TProcListMonThread 实时监视正在运行的进程,并提供进程属性,内存和CPU进程使用率等。 TSysMonThread监视系统并提供基本属性以及CPU,内存和磁盘使用情况 TSysModListMonThread实时监视系统模块并提供其属性 TNetConMonThread通过进程实时监视网络连接并提供其属性 TPerfMonThread实时监视性能计数器并提供其属性 THndListMonThread实时监视系统句柄并提供其属性 TMiTeC_NetCreds提供缓存的网络凭据枚举。 TMiTeC_USBHistory USB使用率检测组件 TMiTeC_WLANC已知的Wi-Fi网络枚举(包括网络密钥)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧