C# 如何检测所选打印机的类型是否为点阵?

C# 如何检测所选打印机的类型是否为点阵?,c#,winapi,printing,dot-matrix,C#,Winapi,Printing,Dot Matrix,通常,在旧版Windows(98或更早版本)中,我可以使用打印机api中的标记技术来获取当前类型的打印机。但它在Windows 2000或更高版本中不可用。在Windows 2000或更高版本中,您还有其他方法检测它吗 在C#中通过WMI查询查询打印机信息的示例代码 谢谢,简短回答:不,似乎没有一种一致的方法可以做到这一点。我尽我所能找到检测点阵打印机的可能方法。我尝试调用GetDeviceCaps函数(检索指定设备的特定于设备的信息),以获取技术项,如果所选打印机是点阵打印机,则该项应返回为

通常,在旧版Windows(98或更早版本)中,我可以使用打印机api中的标记技术来获取当前类型的打印机。但它在Windows 2000或更高版本中不可用。在Windows 2000或更高版本中,您还有其他方法检测它吗

在C#中通过WMI查询查询打印机信息的示例代码


谢谢,

简短回答:不,似乎没有一种一致的方法可以做到这一点。

我尽我所能找到检测点阵打印机的可能方法。我尝试调用GetDeviceCaps函数(检索指定设备的特定于设备的信息),以获取技术项,如果所选打印机是点阵打印机,则该项应返回为字符流

var hdc = CreateDC("WINSPOOL", printerName, null, IntPtr.Zero);
var technology = (DeviceCapTechnology)GetDeviceCaps(hdc, (int)DeviceCap.TECHNOLOGY);
但是,它总是将技术项作为光栅显示返回。我不知道为什么它总是这样返回值

[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);


我想我们可以通过水平分辨率检测到,我的测试点阵打印机的分辨率是120 DPI,而不是普通打印机中的至少300 DPI。但是,它仍然有一些分辨率高于300 DPI的打印机。有分辨率为360dpi的激光器吗?我的经验是,激光器使用300dpi或其倍数。问题是低范围喷墨(可能是360dpi/b&W)和一些奇怪的东西,比如我的标签打印机:180dpi/b&W(但可以通过检查可用纸张来区分)。分辨率不是区分的好方法。我见过至少一维分辨率高达144 dpi的点阵式打印机。如果您确实依赖分辨率,您可能需要检查非常低的分辨率,以排除菊花轮式打印机。为什么您需要知道它是否是点阵打印机?如果我们知道你的动机,也许还有另一种方法可以解决你的问题。
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

[DllImport("gdi32.dll")]
static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);