求教:虚拟打印机和后台打印的实现。

好好單调 2014-05-04 10:08:13
需求:
开发一个虚拟打印机,提供给客户端使用。客户端使用这个虚拟打印机生成文档保存内打印容和设置好的打印选项(打印机选项和文档选项等)(这里称这些打印文档为虚拟打印结果)。
服务端要能够在后台将客户端提供的虚拟打印内容转移到真实打印机上打印出来。


实现思路
客户端上通过修改Printer Processor来开发虚拟打印机。得到两个文件,一个保存打印内容(.spl)(或者直接保存成图片?),一个保存打印选项(.shd)。
服务端在后台使用win32 Api StartDoc之类的函数直接打印。

问题:
1、我的实现思路有问题吗?又或者有更好的实现思路,请指教。
1、客户端这块的spl文件据了解是用于生成emf文件所用,微软没有提供正式文档说明,虽然已经有很多代码来解析这个文件了,但是据说和真实打印的时候生成的还不一样。
2、.shd文件的格式我没搜到什么说明啊,我如何在服务端去解析这个文件来设置真实打印机的打印选项啊?又或者我该自己用文档去保存打印选项,然后再自己解析啊?

比较着急,在线等大神指导,谢谢了!
...全文
773 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
an y 5429 2016-09-13
  • 打赏
  • 举报
回复
楼主你问题解决了没,我这里获取打印信息是遍历打印任务来获取打印设置参数的,你是怎么获取打印信息的呢
ciafbijds 2016-04-16
  • 打赏
  • 举报
回复
楼主,我的思路和你一样,除了你的需求之外,我还想为页面加入条码,根据页面可以找到经办人信息。commanderdsp@126.com
PyJogger 2016-03-02
  • 打赏
  • 举报
回复
楼主,我想问你,你的问题解决了吗,我现在也有同样的需求,解决思路也是先用虚拟打印机截取打印流,修改后再做打印。
好好單调 2014-05-13
  • 打赏
  • 举报
回复
引用 22 楼 FENGQIYUNRAN 的回复:
立思辰文档打印复印安全监控与审计系统
额。 是我误会你了。 抱歉。
好好單调 2014-05-13
  • 打赏
  • 举报
回复
引用 22 楼 FENGQIYUNRAN 的回复:
立思辰文档打印复印安全监控与审计系统
- -这是广告吗
FeelTouch Labs 2014-05-09
  • 打赏
  • 举报
回复
立思辰文档打印复印安全监控与审计系统
好好單调 2014-05-09
  • 打赏
  • 举报
回复
经过几天的研究。基本确定了可以用这个思路实现。 目前做过的实验有: 1、自定义打印处理器:通过不往spooler返回数据来让打印中断。同时转存成自己想要的中间文件。 2、在服务端解析中间文件然后后台打印。 接下来的问题: 如何实际的弄一个虚拟打印机。之前我一直是在别人的虚拟打印机上改注册表做实验。。 思路是什么呢?
shn521 2014-05-04
  • 打赏
  • 举报
回复
能保存为pdf再打印吗
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 supermegaboy 的回复:
[quote=引用 2 楼 a2619308 的回复:] [quote=引用 1 楼 supermegaboy 的回复:] 这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
产品需求决定的。 我这不是要实现在客户端直接打印,而是要在服务端经过审核后才打印的。[/quote] 在服务器中审核这种想法不好,浪费人力,还影响工作效率。现在很多一体机都有用户管理与内容记录功能,像我们公司,使用机器前需要用胸卡和密码验证,打印、复印、扫描的内容会自动存储起来,每个月检查一次,利用公司机器做个人事情的现象一下子绝迹了。[/quote] 老板本人使用公司机器给其子女打印考试卷算不算“利用公司机器做个人事情”?
好好單调 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 supermegaboy 的回复:
[quote=引用 2 楼 a2619308 的回复:] [quote=引用 1 楼 supermegaboy 的回复:] 这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
产品需求决定的。 我这不是要实现在客户端直接打印,而是要在服务端经过审核后才打印的。[/quote] 在服务器中审核这种想法不好,浪费人力,还影响工作效率。现在很多一体机都有用户管理与内容记录功能,像我们公司,使用机器前需要用胸卡和密码验证,打印、复印、扫描的内容会自动存储起来,每个月检查一次,利用公司机器做个人事情的现象一下子绝迹了。[/quote] 额。目的不一样,你说的情况是为了避免员工私用机器。 好了,我们不更改人家的需求,我们只讨论如何实现。
飞天御剑流 2014-05-04
  • 打赏
  • 举报
回复
引用 2 楼 a2619308 的回复:
[quote=引用 1 楼 supermegaboy 的回复:] 这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
产品需求决定的。 我这不是要实现在客户端直接打印,而是要在服务端经过审核后才打印的。[/quote] 在服务器中审核这种想法不好,浪费人力,还影响工作效率。现在很多一体机都有用户管理与内容记录功能,像我们公司,使用机器前需要用胸卡和密码验证,打印、复印、扫描的内容会自动存储起来,每个月检查一次,利用公司机器做个人事情的现象一下子绝迹了。
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 supermegaboy 的回复:
这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
好好單调 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 supermegaboy 的回复:
这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
产品需求决定的。 我这不是要实现在客户端直接打印,而是要在服务端经过审核后才打印的。
飞天御剑流 2014-05-04
  • 打赏
  • 举报
回复
这个东西有现成的,不需要搞开发,windows server的打印服务器能满足要求,还可以设置打印池,为每台打印机分配优先级,分配不同的权限等等。
好好單调 2014-05-04
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
接上帖 nPropertyPages Specifies the number of property page handles in the lphPropertyPages array. lphPropertyPages Contains an array of property page handles to add to the Print property sheet. The additional property pages follow the General page. Use the CreatePropertySheetPage function to create these additional pages. When the PrintDlgEx function returns, all the HPROPSHEETPAGE handles in the lphPropertyPages array have been destroyed. If nPropertyPages is zero, lphPropertyPages should be NULL. nStartPage Specifies the property page that is initially displayed. To display the General page, specify START_PAGE_GENERAL. Otherwise, specify the zero-based index of a property page in the array specified in the lphPropertyPages member. For consistency, it is recommended that the property sheet always be started on the General page. dwResultAction On input, set this member to zero. If the PrintDlgEx function returns S_OK, dwResultAction contains the outcome of the dialog. If PrintDlgEx returns an error, this member should be ignored. The dwResultAction member can be one of the following values. PD_RESULT_APPLY The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not want to print yet. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. PD_RESULT_CANCEL The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. PD_RESULT_PRINT The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. Remarks If both hDevMode and hDevNames are NULL, PrintDlgEx initializes the property sheet using the current default printer. To initialize the property sheet for a different printer, use the wDeviceOffset member of the DEVNAMES structure to specify the name of the printer. Note that the dmDeviceName member of the DEVMODE structure also specifies a printer name. However, dmDeviceName is limited to 32 characters, and the wDeviceOffset name is not. If the wDeviceOffset and dmDeviceName names are not the same, PrintDlgEx initializes the property sheet using the printer specified by wDeviceOffset. If the PD_RETURNDEFAULT flag is set and both hDevMode and hDevNames are NULL, PrintDlgEx uses the hDevNames and hDevMode members to return information about the current default printer without displaying the dialog box. During the execution of PrintDlgEx, the DEVMODE and DEVNAMES structures that you specified in the PRINTDLGEX structure may not always contain current data. For this reason, application-specific property pages as well as IPrintDialogCallback routines for the initial page should use the IPrintDialogServices interface to retrieve information about the state of the current printer. Structure Information Header Declared in Commdlg.h, include Windows.h Minimum operating systems Windows 2000 Unicode Implemented as ANSI and Unicode versions. See Also Common Dialog Box Library, CreatePropertySheetPage, DEVMODE, DEVNAMES, IPrintDialogCallback, IPrintDialogServices, PrintDlgEx --------------------------------------------------------------------------------
没有细看,但根据你提供的内容,我去看了下MFC提供的几个类,CPrintDialogEx、CPageSetupDialog。对于去制作虚拟打印机的UI部分应该有帮助了。 谢谢啦。
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
接上帖 nPropertyPages Specifies the number of property page handles in the lphPropertyPages array. lphPropertyPages Contains an array of property page handles to add to the Print property sheet. The additional property pages follow the General page. Use the CreatePropertySheetPage function to create these additional pages. When the PrintDlgEx function returns, all the HPROPSHEETPAGE handles in the lphPropertyPages array have been destroyed. If nPropertyPages is zero, lphPropertyPages should be NULL. nStartPage Specifies the property page that is initially displayed. To display the General page, specify START_PAGE_GENERAL. Otherwise, specify the zero-based index of a property page in the array specified in the lphPropertyPages member. For consistency, it is recommended that the property sheet always be started on the General page. dwResultAction On input, set this member to zero. If the PrintDlgEx function returns S_OK, dwResultAction contains the outcome of the dialog. If PrintDlgEx returns an error, this member should be ignored. The dwResultAction member can be one of the following values. PD_RESULT_APPLY The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not want to print yet. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. PD_RESULT_CANCEL The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. PD_RESULT_PRINT The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. Remarks If both hDevMode and hDevNames are NULL, PrintDlgEx initializes the property sheet using the current default printer. To initialize the property sheet for a different printer, use the wDeviceOffset member of the DEVNAMES structure to specify the name of the printer. Note that the dmDeviceName member of the DEVMODE structure also specifies a printer name. However, dmDeviceName is limited to 32 characters, and the wDeviceOffset name is not. If the wDeviceOffset and dmDeviceName names are not the same, PrintDlgEx initializes the property sheet using the printer specified by wDeviceOffset. If the PD_RETURNDEFAULT flag is set and both hDevMode and hDevNames are NULL, PrintDlgEx uses the hDevNames and hDevMode members to return information about the current default printer without displaying the dialog box. During the execution of PrintDlgEx, the DEVMODE and DEVNAMES structures that you specified in the PRINTDLGEX structure may not always contain current data. For this reason, application-specific property pages as well as IPrintDialogCallback routines for the initial page should use the IPrintDialogServices interface to retrieve information about the state of the current printer. Structure Information Header Declared in Commdlg.h, include Windows.h Minimum operating systems Windows 2000 Unicode Implemented as ANSI and Unicode versions. See Also Common Dialog Box Library, CreatePropertySheetPage, DEVMODE, DEVNAMES, IPrintDialogCallback, IPrintDialogServices, PrintDlgEx --------------------------------------------------------------------------------
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
接上帖 PD_RETURNDEFAULT If this flag is set, the PrintDlgEx function does not display the property sheet. Instead, it sets the hDevNames and hDevMode members to handles to DEVNAMES and DEVMODE structures that are initialized for the system default printer. Both hDevNames and hDevMode must be NULL, or PrintDlgEx returns an error. PD_RETURNIC Similar to the PD_RETURNDC flag, except this flag returns an information context rather than a device context. If neither PD_RETURNDC nor PD_RETURNIC is specified, hDC is undefined on output. PD_SELECTION If this flag is set, the Selection radio button is selected. If none of the PD_PAGENUMS, PD_SELECTION, or PD_CURRENTPAGE flags is set, the All radio button is selected. PD_USEDEVMODECOPIES Same as PD_USEDEVMODECOPIESANDCOLLATE. PD_USEDEVMODECOPIESANDCOLLATE This flag indicates whether your application supports multiple copies and collation. Set this flag on input to indicate that your application does not support multiple copies and collation. In this case, the nCopies member of the PRINTDLGEX structure always returns 1, and PD_COLLATE is never set in the Flags member. If this flag is not set, the application is responsible for printing and collating multiple copies. In this case, the nCopies member of the PRINTDLGEX structure indicates the number of copies the user wants to print, and the PD_COLLATE flag in the Flags member indicates whether the user wants collation. Regardless of whether this flag is set, an application can determine from nCopies and PD_COLLATE how many copies to render and whether to print them collated. If this flag is set and the printer driver does not support multiple copies, the Copies edit control is disabled. Similarly, if this flag is set and the printer driver does not support collation, the Collate check box is disabled. The dmCopies and dmCollate members of the DEVMODE structure contain the copies and collate information used by the printer driver. If this flag is set and the printer driver supports multiple copies, the dmCopies member indicates the number of copies requested by the user. If this flag is set and the printer driver supports collation, the dmCollate member of the DEVMODE structure indicates whether the user wants collation. If this flag is not set, the dmCopies member always returns 1, and the dmCollate member is always zero. PD_USELARGETEMPLATE Forces the property sheet to use a large template for the General page. The larger template provides more space for applications that specify a custom template for the lower portion of the General page. Flags2 Reserved. Must be set to 0. ExclusionFlags A set of bit flags that can exclude items from the printer driver property pages in the Print property sheet. This value is used only if the PD_EXCLUSIONFLAGS flag is set in the Flags member. Exclusion flags should be used only if the item to be excluded will be included on either the General page or on an application-defined page in the Print property sheet. This member can specify the following flag. PD_EXCL_COPIESANDCOLLATE Excludes the Copies and Collate controls from the printer driver property pages in a Print property sheet. This flag should always be set when the application uses the default Copies and Collate controls provided by the lower portion of the General page of the Print property sheet. nPageRanges On input, set this member to the initial number of page ranges specified in the lpPageRanges array. When the PrintDlgEx function returns, nPageRanges indicates the number of user-specified page ranges stored in the lpPageRanges array. If the PD_NOPAGENUMS flag is specified, this value is not valid. nMaxPageRanges Specifies the size, in array elements, of the lpPageRanges buffer. This value indicates the maximum number of page ranges that can be stored in the array. If the PD_NOPAGENUMS flag is specified, this value is not valid. If the PD_NOPAGENUMS flag is not specified, this value must be greater than zero. lpPageRanges Pointer to a buffer containing an array of PRINTPAGERANGE structures. On input, the array contains the initial page ranges to display in the Pages edit control. When the PrintDlgEx function returns, the array contains the page ranges specified by the user. If the PD_NOPAGENUMS flag is specified, this value is not valid. If the PD_NOPAGENUMS flag is not specified, lpPageRanges must be non-NULL. nMinPage Specifies the minimum value for the page ranges specified in the Pages edit control. If the PD_NOPAGENUMS flag is specified, this value is not valid. nMaxPage Specifies the maximum value for the page ranges specified in the Pages edit control. If the PD_NOPAGENUMS flag is specified, this value is not valid. nCopies Contains the initial number of copies for the Copies edit control if hDevMode is NULL; otherwise, the dmCopies member of the DEVMODE structure contains the initial value. When PrintDlgEx returns, nCopies contains the actual number of copies the application must print. This value depends on whether the application or the printer driver is responsible for printing multiple copies. If the PD_USEDEVMODECOPIESANDCOLLATE flag is set in the Flags member, nCopies is always 1 on return, and the printer driver is responsible for printing multiple copies. If the flag is not set, the application is responsible for printing the number of copies specified by nCopies. For more information, see the description of the PD_USEDEVMODECOPIESANDCOLLATE flag. hInstance If the PD_ENABLEPRINTTEMPLATE flag is set in the Flags member, hInstance is a handle to the application or module instance that contains the dialog box template named by the lpPrintTemplateName member. If the PD_ENABLEPRINTTEMPLATEHANDLE flag is set in the Flags member, hInstance is a handle to a memory object containing a dialog box template. If neither of the template flags is set in the Flags member, hInstance should be NULL. lpPrintTemplateName Pointer to a null-terminated string that names a dialog box template resource in the module identified by the hInstance member. This template replaces the default dialog box template in the lower portion of the General page. The default template contains controls similar to those of the Print dialog box. This member is ignored unless the PD_ENABLEPRINTTEMPLATE flag is set in the Flags member. lpCallback Pointer to an application-defined callback object. The object should contain the IPrintDialogCallback class to receive messages for the child dialog box in the lower portion of the General page. The callback object should also contain the IObjectWithSite class to receive a pointer to the IPrintDialogServices interface. The PrintDlgEx function calls IUnknown::QueryInterface on the callback object for both IID_IPrintDialogCallback and IID_IObjectWithSite to determine which interfaces are supported. If you do not want to retrieve any of the callback information, set lpCallback to NULL. 未完待续
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
PRINTDLGEX Structure -------------------------------------------------------------------------------- The PRINTDLGEX structure contains information that the PrintDlgEx function uses to initialize the Print property sheet. After the user closes the property sheet, the system uses this structure to return information about the user's selections. Syntax typedef struct tagPDEX { DWORD lStructSize; HWND hwndOwner; HGLOBAL hDevMode; HGLOBAL hDevNames; HDC hDC; DWORD Flags; DWORD Flags2; DWORD ExclusionFlags; DWORD nPageRanges; DWORD nMaxPageRanges; LPPRINTPAGERANGE lpPageRanges; DWORD nMinPage; DWORD nMaxPage; DWORD nCopies; HINSTANCE hInstance; LPCTSTR lpPrintTemplateName; LPUNKNOWN lpCallback; DWORD nPropertyPages; HPROPSHEETPAGE *lphPropertyPages; DWORD nStartPage; DWORD dwResultAction; } PRINTDLGEX, *LPPRINTDLGEX; Members lStructSize Specifies the structure size, in bytes. hwndOwner Handle to the window that owns the property sheet. This member must be a valid window handle; it cannot be NULL. hDevMode Handle to a movable global memory object that contains a DEVMODE structure. If hDevMode is not NULL on input, you must allocate a movable block of memory for the DEVMODE structure and initialize its members. The PrintDlgEx function uses the input data to initialize the controls in the property sheet. When PrintDlgEx returns, the DEVMODE members indicate the user's input. If hDevMode is NULL on input, PrintDlgEx allocates memory for the DEVMODE structure, initializes its members to indicate the user's input, and returns a handle that identifies it. For more information about the hDevMode and hDevNames members, see the Remarks section at the end of this topic. hDevNames Handle to a movable global memory object that contains a DEVNAMES structure. If hDevNames is not NULL on input, you must allocate a movable block of memory for the DEVNAMES structure and initialize its members. The PrintDlgEx function uses the input datato initialize the controls in the property sheet. When PrintDlgEx returns, the DEVNAMES members contain information for the printer chosen by the user. You can use this information to create a device context or an information context. The hDevNames member can be NULL, in which case, PrintDlgEx allocates memory for the DEVNAMES structure, initializes its members to indicate the user's input, and returns a handle that identifies it. For more information about the hDevMode and hDevNames members, see the Remarks section at the end of this topic. hDC Handle to a device context or an information context, depending on whether the Flags member specifies the PD_RETURNDC or PC_RETURNIC flag. If neither flag is specified, the value of this member is undefined. If both flags are specified, PD_RETURNDC has priority. Flags A set of bit flags that you can use to initialize the Print property sheet. When the PrintDlgEx function returns, it sets these flags to indicate the user's input. This member can be one or more of the following values. PD_ALLPAGES The default flag that indicates that the All radio button is initially selected. This flag is used as a placeholder to indicate that the PD_PAGENUMS, PD_SELECTION, and PD_CURRENTPAGE flags are not specified. PD_COLLATE If this flag is set, the Collate check box is selected. If this flag is set when the PrintDlgEx function returns, the application must simulate collation of multiple copies. For more information, see the description of the PD_USEDEVMODECOPIESANDCOLLATE flag. See PD_NOPAGENUMS. PD_CURRENTPAGE If this flag is set, the Current Page radio button is selected. If none of the PD_PAGENUMS, PD_SELECTION, or PD_CURRENTPAGE flags is set, the All radio button is selected. PD_DISABLEPRINTTOFILE Disables the Print to File check box. PD_ENABLEPRINTTEMPLATE Indicates that the hInstance and lpPrintTemplateName members specify a replacement for the default dialog box template in the lower portion of the General page. The default template contains controls similar to those of the Print dialog box. The system uses the specified template to create a window that is a child of the General page. PD_ENABLEPRINTTEMPLATEHANDLE Indicates that the hInstance member identifies a data block that contains a preloaded dialog box template. This template replaces the default dialog box template in the lower portion of the General page. The system uses the specified template to create a window that is a child of the General page. The system ignores the lpPrintTemplateName member if this flag is specified. PD_EXCLUSIONFLAGS Indicates that the ExclusionFlags member identifies items to be excluded from the printer driver property pages. If this flag is not set, items will be excluded by default from the printer driver property pages. The exclusions prevent the duplication of items among the General page, any application-specified pages, and the printer driver pages. PD_HIDEPRINTTOFILE Hides the Print to File check box. PD_NOCURRENTPAGE Disables the Current Page radio button. PD_NOPAGENUMS Disables the Pages radio button and the associated edit controls. Also, it causes the Collate check box to appear in the dialog. PD_NOSELECTION Disables the Selection radio button. PD_NOWARNING Prevents the warning message from being displayed when an error occurs. PD_PAGENUMS If this flag is set, the Pages radio button is selected. If none of the PD_PAGENUMS, PD_SELECTION, or PD_CURRENTPAGE flags is set, the All radio button is selected. If this flag is set when the PrintDlgEx function returns, the lpPageRanges member indicates the page ranges specified by the user. PD_PRINTTOFILE If this flag is set, the Print to File check box is selected. If this flag is set when PrintDlgEx returns, the offset indicated by the wOutputOffset member of the DEVNAMES structure contains the string "FILE:". When you call the StartDoc function to start the printing operation, specify this "FILE:" string in the lpszOutput member of the DOCINFO structure. Specifying this string causes the print subsystem to query the user for the name of the output file. PD_RETURNDC Causes PrintDlgEx to return a device context matching the selections the user made in the property sheet. The device context is returned in hDC. 未完待续
好好單调 2014-05-04
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
Printing and Print Spooler Functions The following functions are used to print. AbortDoc DeviceCapabilities EndDoc EndPage Escape ExtEscape SetAbortProc StartDoc StartPage The following functions are used to access the print spooler. AbortPrinter AbortProc AddForm AddJob AddMonitor AddPort AddPrinter AddPrinterConnection AddPrinterDriver AddPrinterDriverEx AddPrintProcessor AddPrintProvidor AdvancedDocumentProperties ClosePrinter ConfigurePort ConnectToPrinterDlg DeleteForm DeleteMonitor DeletePort DeletePrinter DeletePrinterConnection DeletePrinterData DeletePrinterDataEx DeletePrinterDriver DeletePrinterDriverEx DeletePrinterKey DeletePrintProcessor DeletePrintProvidor DocumentProperties EndDocPrinter EndPagePrinter EnumForms EnumJobs EnumMonitors EnumPorts EnumPrinterData EnumPrinterDataEx EnumPrinterDrivers EnumPrinterKey EnumPrinters EnumPrintProcessorDatatypes EnumPrintProcessors FindClosePrinterChangeNotification FindFirstPrinterChangeNotification FindNextPrinterChangeNotification FreePrinterNotifyInfo GetForm GetJob GetPrinter GetPrinterData GetPrinterDataEx GetPrinterDriver GetPrinterDriverDirectory GetPrintProcessorDirectory OpenPrinter PrinterMessageBox PrinterProperties ReadPrinter ResetPrinter ScheduleJob SetForm SetJob SetPort SetPrinter SetPrinterData SetPrinterDataEx StartDocPrinter StartPagePrinter WritePrinter Obsolete Functions WaitForPrinterChange
好吧,您很热心我很感谢。我现在不知道如何将客户端设置好的打印选项(打印多少页)保存下来,让服务端可以知道并进行后台直接设置。。。
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
Printing and Print Spooler Functions The following functions are used to print. AbortDoc DeviceCapabilities EndDoc EndPage Escape ExtEscape SetAbortProc StartDoc StartPage The following functions are used to access the print spooler. AbortPrinter AbortProc AddForm AddJob AddMonitor AddPort AddPrinter AddPrinterConnection AddPrinterDriver AddPrinterDriverEx AddPrintProcessor AddPrintProvidor AdvancedDocumentProperties ClosePrinter ConfigurePort ConnectToPrinterDlg DeleteForm DeleteMonitor DeletePort DeletePrinter DeletePrinterConnection DeletePrinterData DeletePrinterDataEx DeletePrinterDriver DeletePrinterDriverEx DeletePrinterKey DeletePrintProcessor DeletePrintProvidor DocumentProperties EndDocPrinter EndPagePrinter EnumForms EnumJobs EnumMonitors EnumPorts EnumPrinterData EnumPrinterDataEx EnumPrinterDrivers EnumPrinterKey EnumPrinters EnumPrintProcessorDatatypes EnumPrintProcessors FindClosePrinterChangeNotification FindFirstPrinterChangeNotification FindNextPrinterChangeNotification FreePrinterNotifyInfo GetForm GetJob GetPrinter GetPrinterData GetPrinterDataEx GetPrinterDriver GetPrinterDriverDirectory GetPrintProcessorDirectory OpenPrinter PrinterMessageBox PrinterProperties ReadPrinter ResetPrinter ScheduleJob SetForm SetJob SetPort SetPrinter SetPrinterData SetPrinterDataEx StartDocPrinter StartPagePrinter WritePrinter Obsolete Functions WaitForPrinterChange
加载更多回复(7)

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧