我希望能够在不打开打印机属性窗口的情况下更改打印机属性...
到目前为止,使用DocumentProperties(从winspool.drv导入)函数失败了,因为虽然很容易抑制对话框显示,但似乎PrinterSettings.GetHdevmode()返回的值不反映调用它的PrinterSettings ,而是之前打印机属性的值返回OK.例如,这给了我上次调用属性的先前(错误)值,而不是它应该来自PrinterSettings对象的值:
IntPtr hdevmode = PrinterSettings.GetHdevmode(PrinterSettings.DefaultPageSettings);
PrinterSettings.SetHdevmode(hdevmode);
PrinterSettings.DefaultPageSettings.SetHdevmode(hdevmode);
Run Code Online (Sandbox Code Playgroud)
那么GetHdevmode有一个bug还是它应该做的呢?有没有C#可以解决这个问题,还是有人甚至没有任何相关信息?我甚至很难找到关于这个主题的信息.
提前感谢您的任何见解.
编辑:我不想让这个问题太个人化,但希望在这种情况下拥有所有信息可以提供一个对其他人也是有用的解决方案的答案.
这是我编写的C++ DLL,以便为此问题找到解决方法.它目前没有工作 - 它改变了其他内存,如副本,并没有成功改变"底层"纸张大小.我认为我需要做的就是指定out缓冲区标志以进行更改?
extern "C" __declspec(dllexport) DEVMODE* __stdcall GetRealHDevMode(int width, int height, char *printerName, DEVMODE* inDevMode)
{
//declare handles and variables
HANDLE printerHandle;
LPHANDLE printerHandlePointer(&printerHandle);
//get printer handle pointer
OpenPrinter((LPWSTR)printerName, printerHandlePointer, NULL);
//Get size needed for public and private devmode data and declare devmode structure
size_t devmodeSize = DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, NULL, NULL, 0);
DEVMODE* devmode = reinterpret_cast<DEVMODE*>(new char[devmodeSize + sizeof(DEVMODE) + sizeof(inDevMode->dmDriverExtra)]);
//lock memory
GlobalLock(devmode);
//fill …Run Code Online (Sandbox Code Playgroud) 我正在使用WPF,需要让用户设置一些打印相关选项,如打印机和打印机属性(例如papertray,横向/纵向,双面打印等).我知道PrintDialog类可以获取PrintQueue和PrintTicket对象.但是,我需要创建自定义解决方案,无法显示PrintDialog.我设法获得可用的PrintQueue对象,并让用户选择一台打印机.我正在努力打印机属性.我的问题是:如何显示用户可以为所选PrintQueue设置打印机属性的对话框(当用户单击WPF PrintDialog中的"属性"按钮时显示的对话框).
我想修改System.Drawing.Printing.PrinterSettings对象,我从System.Windows.Forms.PrintDialog得到对话框已显示给用户之后.虽然我可以在PrinterSettings对象上更改属性值,但在打印文档时实际上会考虑在显示对话框后我所做的任何更改.
这是我的意思的一个例子:
//Show the printdialog and retreive the printersettings
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() != DialogResult.OK)
return;
var printerSettings = printDialog.PrinterSettings;
//Now modify the printersettings object
printerSettings.ToPage = 8;
Run Code Online (Sandbox Code Playgroud)
现在使用printerSettings对象进行打印.我使用第三方dll Aspose.Words,因为我需要打印Word,但这似乎不是问题.似乎在显示对话框后,所有设置都已提交到打印机并且更改PrinterSettings什么也没做.有关如何使其工作的任何想法?
编辑:我有一些解决方法.我想要的是得到这些具体问题的答案:是否可以在显示对话框后更改PrinterSettings对象,并在打印时考虑这些更改.如果有人知道只有一个如何这样的工作方式(你可以在你想用于打印什么API决定,它不只要PrinterSettings对象使用关系),我会非常感激.