终端服务(Win32)下的打印问题

时间:2009-08-06 22:52:16

标签: winapi printing gdi

对于我们的应用程序,我们需要能够在页面上的特定位置打印输出。例如,我们需要能够以相对于页面左上角的精确(1.00“,1.00”)打印一些文本。问题在于,各种GDI调用中的所有坐标都不是相对于显示器的左上角,而是相对于设备相关的偏移量,使用以下代码获得:

int cx = ::GetDeviceCaps(hDC, PHYSICALOFFSETX);
int cy = ::GetDeviceCaps(hDC, PHYSICALOFFSETY);

当然,这些是设备单元,因此您可以根据需要将它们转换为逻辑单元。然后,您可以调整其他API调用中的坐标,以便将输出准确地输出到您需要的位置。

在Windows下直接运行时,这就像一个魅力。但是,在Windows Server 2008上使用终端服务打印到重定向的打印机时,DeviceCaps功能不再报告正确的信息,至少对于大量不同的打印机而言。设备偏移量报告为0,并且在查询页面上的可打印区域时,返回不正确的信息(API夸大了可用的不动产量)。更糟糕的是,似乎MS或打印机驱动程序供应商都知道这个问题,因为当打印作业假脱机到本地计算机时(这样它就可以转到本地打印机),所有的输出都会被一些补偿转移量;一个似乎是黑客的数量,因为它无法接近GetDeviceCaps在本地查询打印机功能时报告的正确值。

因此,结果是打印输出从页面移开......

还有其他人看过这类问题吗?我是否想要精确控制打印输出?当然,为了正确分页,需要一个准确的可用可打印空间量的值,不是吗?任何帮助或指示将不胜感激。