【发布时间】:2021-10-11 21:08:49
【问题描述】:
当我想在纸上的一些其他图形上打印半透明的 32 bpp 图像时,我正在使用 AlphaBlend 函数,就像我在屏幕上所做的那样。
这适用于某些打印机驱动程序,但不适用于其他打印机驱动程序。如果这不起作用,则使用不透明(白色)背景绘制图像,并且下方的文本或图形不会出现在图像区域中。
同一台打印机的两个驱动程序会产生两种不同的结果。我可以使用下面的代码和下面的解释来区分它们:
char technology[MAX_PATH] = {0};
int escapeCode = GETTECHNOLOGY;
if (ExtEscape(hdc, QUERYESCSUPPORT, sizeof(int), (LPCSTR) &escapeCode, 0, nullptr) > 0)
{
if (ExtEscape(hdc, GETTECHNOLOGY, 0, nullptr, MAX_PATH, (LPSTR) technology) > 0)
{
return technology;
}
}
一方面,如果technology 包含"http://schemas.microsoft.com/xps/2005/06",则AlphaBlend 正在工作;另一方面,当technology 为"ESC/P" 时,AlphaBlend 不起作用。
是否有检测此功能的通用方法?
根据https://www.winvistatips.com/threads/trick-to-hooking-drvalphablend-in-printer-driver.178598,打印机驱动程序支持AlphaBlend时:
-
DrvAlphaBlend在驱动 DLL 中实现 -
HOOK_ALPHABLEND存在于DrvFuncTable -
HOOK_ALPHABLEND由EngAssociateSurface返回
如果支持DrvAlphaBlend,我如何使用 Win32 API(或通过其他方式)检查?
【问题讨论】: