代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

检查打印机是否已连接

  •  5
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 15 年前

    在Windows(在Windows CE中工作)中是否有一种方法来检查打印机是否连接并在C++中与LPT1通信?


    [编辑] 更多信息:

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

    我们不能打电话 PrintDlg() 显示打印对话框,因为它是 太复杂了, 但我们也不能用 PD_RETURNDEFAULT 因为我们不想使用默认打印机。因此,我们正在手动设置 DEVMODE 要传递到的结构 创建DC .

    在我们拿到信用证后,我们打电话给 GetDeviceCaps() 要获取打印机的信息(如页面宽度等),则 StartPage() / EndPage() / ExtTextOut() 打印。

    但是,如果没有连接打印机,程序将冻结大约一分钟,然后给出 “中止/重试/失败?” 对话(我不知道这个过程中什么时候会冻结)。其他软件在您尝试打印时不会冻结,因此 必须 是一种防止这种情况发生的方法…

    6 回复  |  直到 15 年前
        1
  •  2
  •   robert_x44    15 年前

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

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

    这可能会返回比尝试使用DC打印更好的故障。 如果可以,在打开DC进行打印之前,不要忘记对从createfile返回的句柄调用closeHandle()。

        2
  •  3
  •   Max Kielland    15 年前

    在Windows中使用打印机时,实际上不应该直接使用端口,而是通过打印机驱动程序接口。这会使您对如何进行通信的知识变得过时,并为您提供了一个适用于所有打印机的工具箱,不管其品牌和端口如何。

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

    您应该询问打印机开发人员是否有Windows CE驱动程序。我不确定插入/拔出并行打印机时是否生成设备更改消息。它适用于USB打印机(不需要在注册表中乱搞)。

    您可以阅读有关打印子系统的更多信息 here

        3
  •  2
  •   ctacke    15 年前

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

        4
  •  2
  •   Danra Bathsheba    15 年前

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

        5
  •  2
  •   Chubsdad    15 年前

    一种可能性是 enumerate devices 并检查是否正在枚举您的设备。不确定它是否在WinCE上工作

        6
  •  0
  •   Icemanind    15 年前

    我不知道你是否使用.NET托管代码,但这里有一个链接,说明如何使用VB.NET(可以转换为C++.NET托管)使用LPT端口: http://support.microsoft.com/default.aspx?scid=kb;en-us;823179

    希望这有帮助!

    推荐文章