Windows(在Windows CE中有效)是否有办法检查打印机是否已连接并与C ++中的LPT1通信?
[编辑] 更多信息:
我们目前正在使用通用的Windows CE打印机驱动程序 - pcl.dll
- 将其传递到CreateDC
,以获取打印机的DC。
我们无法调用PrintDlg()
来显示打印对话框,因为它“太复杂了”但我们也无法使用PD_RETURNDEFAULT
调用它,因为我们不想使用默认打印机。因此,我们手动设置DEVMODE
结构以传递到CreateDC
。
我们收到DC后,我们致电GetDeviceCaps()
获取打印机的信息(例如页面宽度等),然后StartPage()
/ EndPage()
/ {{1}打印。
但是,如果没有连接打印机,程序会在给出“中止/重试/失败?”对话框之前冻结大约一分钟(我不知道这个过程中有什么意义很冷)。当您尝试打印时,其他软件不会冻结,因此必须才能防止这种情况......
答案 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} }
希望这有帮助!