阅读:2789回复:7
windows 打印流程
1、应用程序发出调用。两部分 a、作业控制 b、绘图指令
伪码如下: HDC hPrintDC=CreateDC(---); StartDoc(hPrintDC,lpDocInfo); //作业控制spool组件 //每页相关设置 StartPage(hPrintDC); CreatePen(---); //输出属性控制 打印机驱动程序 CreateBrush(----); CreateFont(------); SelectObject(hPrintDC,----);//3个 LineTo(hPrintDC,-----); //绘图 TextOut(hPrintDC,----); SelectObject(hPrintDC,----);//3个 EndPage(hPrintDC); EndDoc(hPrintDC); 2、GDI承接上述所有应用程序调用。根据当前设置 A、或将调用转入打印机驱动程序(RAW),或生成绘图原语(EMF) B、将作业控制调用转入spool组件。 3、Winspool.drv 输出所有spool相关win32 api,RPC的Stubs(残根)。如果远程调用需在这里进行调整。 一些从winspool.drv导出的函数: GetPrinterA GetPrinterW SetPrinterA SetPrinterW DeviceCapabilitiesA DeviceCapabilitiesW GetJobA GetJobW AddJobA AddJobW 上述程序中主要用到作业控制函数如AddJob等,由系统调控调用顺序和过程。如果当前格式为emf则协同GDI用绘图原语渲染页面。 如果每页需要有自己不同的设置。则需要调用打印机设置函数如SetPrinter等。 4、Spoolsv.exe 服务器转发Winspool.drv的调用。 5、基于句柄和打印机名决定那个Print Provider被调用。 6、Print Provider 实做大部分spool函数。 7、Print Processors 把脱机数据(EMF)转为仿真相关(RAW). 8、Language Monitors 1、提供双向通讯。2、添加作业控制信息到数据流 9、Port Monitors 同核心模式的端口硬件驱动进行通讯。 注:打印机驱动程序负责响应GDI调用,用仿真命令组织页面。 再详细的资料可以参考msdn和ddk |
|
最新喜欢:Pregun... |
沙发#
发布于:2003-01-17 23:23
在此过程中,在哪里可以截获打印任务?
比如说,用监测软件,把送来的打印任务全部暂停,并列表显示,然后选择打印。 我知道,有个WM_SPOOLERSTATUS消息,但用spy++监测却无法捕捉到该消息。 |
|
板凳#
发布于:2003-01-20 08:39
你看一下spooler里那组api可否胜任你的任务
以EnumJobs为索引在msdn中可找到。 其他办法,比较麻烦了恐怕也不是全局性的。 |
|
地板#
发布于:2003-01-22 10:47
我找了一些源程序,好象都不能捕捉到WM_SPOOLERSTATUS。
所以我现在放弃用WM_SPOOLERSTATUS消息了,但又有问题了: 我用winspool下的SetPrinter,来设置打印机的工作状态(比如暂停等),但是不起作用。我是在win2000下调试的,是不是只有win9x才行? |
|
地下室#
发布于:2003-02-14 15:54
严重关注!
如何可以接管win2000的打印? 用什么API? |
|
5楼#
发布于:2003-02-26 16:17
如果我要监控打印的文件名怎么做啊,我是了好几个API都没有文件名。
|
|
6楼#
发布于:2003-02-27 15:12
看看打印处理器
也许有帮助 |
|
7楼#
发布于:2003-07-15 01:39
你好,daoshi
怎样在第2步a,硬性规定只生成emf数据流? 谢谢 |
|