检查是否连接了打印机

时间:2010-09-16 13:47:20

标签: c++ windows windows-mobile printing windows-ce

Windows(在Windows CE中有效)是否有办法检查打印机是否已连接并与C ++中的LPT1通信?


[编辑] 更多信息:

我们目前正在使用通用的Windows CE打印机驱动程序 - pcl.dll - 将其传递到CreateDC,以获取打印机的DC。

我们无法调用PrintDlg()来显示打印对话框,因为它“太复杂了”但我们也无法使用PD_RETURNDEFAULT调用它,因为我们不想使用默认打印机。因此,我们手动设置DEVMODE结构以传递到CreateDC

我们收到DC后,我们致电GetDeviceCaps()获取打印机的信息(例如页面宽度等),然后StartPage() / EndPage() / {{1}打印。

但是,如果没有连接打印机,程序会在给出“中止/重试/失败?”对话框之前冻结大约一分钟(我不知道这个过程中有什么意义很冷)。当您尝试打印时,其他软件不会冻结,因此必须才能防止这种情况......

6 个答案:

答案 0 :(得分:3)

当您在Windows中使用打印机时,您实际上从不应该直接使用该端口,而是通过打印机驱动程序界面。这废弃了如何沟通的知识,并为您提供了一个适用于所有打印机的工具箱,无论品牌和端口如何。

Windows API为您提供了从驱动程序中提取额外信息的多种可能性。在我14年的打印机开发过程中,Microsoft从未添加过对丰富打印机状态的支持(尽管我不知道它们是否在Windows 7中已经改变了)。我们和许多其他打印机开发人员一样,必须扩展打印机驱动程序以向应用程序提供更多信息。

您应该询问您的打印机开发人员是否有Windows CE驱动程序。插入/拔出并行打印机时,我不确定是否生成了DEVICE_CHANGE消息。它适用于USB打印机(无需在注册表中乱七八糟)。

您可以阅读有关打印子系统here

的更多信息

答案 1 :(得分:2)

如果是USB打印机,您可以查看USB打印机类驱动程序注册表项,看看它是否已插入,然后再继续。

答案 2 :(得分:2)

您是否尝试使用Windows CE端口监视器功能? http://msdn.microsoft.com/en-us/library/ms893529.aspx

答案 3 :(得分:2)

一种可能性是enumerate devices并检查您的设备是否被枚举。不确定它是否适用于WinCE

答案 4 :(得分:2)

我还建议枚举设备,但你可以尝试以下函数来查看它是否能够快速优雅地挂起(我目前没有任何测试方法......):

CreateFile("LPT1:", 0, 0, NULL, OPEN_EXISTING, ...);
DeviceIOControl(HANDLE, IOCTL_PARALLEL_STATUS, ...);

这可能会比尝试使用DC打印更好地返回故障。 如果有效,请不要忘记在打开DC进行打印之前,在从CreateFile返回的HANDLE上调用CloseHandle()。

答案 5 :(得分:0)

我不知道您是否使用.NET托管代码,但这里有一个关于如何使用VB.NET使用LPT端口的链接(可以转换为C ++ .NET托管):{{3} }

希望这有帮助!