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

Winapi 终端服务(Win32)下的打印问题,winapi,printing,gdi,Winapi,Printing,Gdi,对于我们的应用程序,我们需要能够在页面上的特定位置打印输出。例如,我们需要能够打印一些文本,精确到页面左上角的1.00,1.00。问题在于,各种GDI调用中的所有坐标都不是相对于显示器的左上角,而是相对于依赖于设备的偏移量,通过以下代码获得: int cx = ::GetDeviceCaps(hDC, PHYSICALOFFSETX); int cy = ::GetDeviceCaps(hDC, PHYSICALOFFSETY); 当然,这些是设备单元,因此您可以根据需要将它们转换为逻辑单元。

对于我们的应用程序,我们需要能够在页面上的特定位置打印输出。例如,我们需要能够打印一些文本,精确到页面左上角的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报告的正确值相差甚远,因此似乎是一个黑客行为

因此,结果是打印输出被移出页面


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

Microsoft知识库问题和附带的修补程序将解决此问题: