Доброго всем времени суток!
Подобный вопрос уже задавался здесь
http://rsdn.ru/forum/dotnet/2646754.aspxАвтор: Хэлкар
Дата: 06.09.07
но остался к сожалению без ответа.
Естъ простое WPF-приложение, имеет ComboBox "Выбор принтера" и 2 кнопки "свойства принтера" и "печать".
Цель приложения, как видно, проста, распечатать разные документы (doc, txt, pdf) из одной папки.
К сожалению имеющийся код не работает, т.е. я могу выбрать принтер, изменяю его настройки, но печать идет со стандартными настройками.
Как я понимаю, вариант с
Process p = new Process();...
не самый лучший
Функции выводятся в следующем порядке:
OpenPrinterPropertiesDialog(...)
SetAsDefaultPrinter(...)
PrintDoc(...)
Буду рад любой помощи, заранее спасибо!
Вот мои функции, пожалуйста сильно не пинать, делаю первые, не легкие шаги
// Выбираю нужные настройки
private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, PageSettings pageSettings)
{
try
{
PrintQueue printQueue = null;
PrintQueue printDefaultQueue = null;
LocalPrintServer localPrintServer = new LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection localPrinterCollection = localPrintServer.GetPrintQueues();
System.Collections.IEnumerator localPrinterEnumerator =
localPrinterCollection.GetEnumerator();
while (localPrinterEnumerator.MoveNext())
{
// Get PrintQueue from available printer
printQueue = (PrintQueue)localPrinterEnumerator.Current;
if (printQueue.FullName.CompareTo(printerSettings.PrinterName) == 0)
printDefaultQueue = (PrintQueue)localPrinterEnumerator.Current;
}
//PrintTicket selectedPrintTicket = printDefaultQueue.DefaultPrintTicket;
PrintTicketConverter ptc = new PrintTicketConverter(printDefaultQueue.FullName, printDefaultQueue.ClientPrintSchemaVersion);
IntPtr mainWindowPtr = new WindowInteropHelper(App.Current.MainWindow).Handle;
byte[] PrintDevMode = ptc.ConvertPrintTicketToDevMode(printDefaultQueue.UserPrintTicket, BaseDevModeType.UserDefault);
GCHandle pinnedDevMode = GCHandle.Alloc(PrintDevMode, GCHandleType.Pinned);
//IntPtr pDevMode = pinnedDevMode.AddrOfPinnedObject();
pDevMode = pinnedDevMode.AddrOfPinnedObject();
int result = DocumentProperties(mainWindowPtr, IntPtr.Zero, printDefaultQueue.FullName, pDevMode, pDevMode, 14);
if (result == 1)
{
printDefaultQueue.UserPrintTicket = ptc.ConvertDevModeToPrintTicket(PrintDevMode);
printerSettings.SetHdevmode(pDevMode);
printerSettings.DefaultPageSettings.SetHdevmode(pDevMode);
if (pageSettings != null)
pageSettings.SetHdevmode(pDevMode);
}
pinnedDevMode.Free();
}
catch (Exception ex)
{
string.Format("{0}", ex.Message);
}
}
//Указываю принтер с моими настройками по умолчанию
int SetAsDefaultPrinter(PrinterSettings printerDevice)
{
int ret = 0;
if (SetDefaultPrinter(printerDevice.PrinterName))
{
printerDevice.SetHdevmode(pDevMode);
System.Windows.Forms.PageSetupDialog psd = new System.Windows.Forms.PageSetupDialog();
psd.PrinterSettings = printerDevice;
psd.PageSettings = printerDevice.DefaultPageSettings;
//Set other default properties
PrinterSettings settings = new PrinterSettings();
PageSettings pgSettings = printerDevice.DefaultPageSettings;
psd.ShowDialog();
ret = 1;
}
else
{
string path = "win32_printer.DeviceId='" + printerDevice.PrinterName + "'";
using (ManagementObject printer = new ManagementObject(path))
{
ManagementBaseObject outParams =
printer.InvokeMethod("SetDefaultPrinter", null, null);
ret = (int)(uint)outParams.Properties["ReturnValue"].Value;
}
}
return ret;
}
// Печатаю
public void PrintDoc(FileInfo value)
{
Process p = new Process();
try
{
if (!value.Exists)
throw new FileNotFoundException("File doesn't exist");
p.StartInfo.FileName = value.FullName;
//Hide the window.
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//p.StartInfo.UseShellExecute = true;
p.StartInfo.Verb = "Print";
//p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit(10000);
if (!p.HasExited)
{
p.CloseMainWindow();
p.Close();
}
}
catch (Exception ex)
{
#if DEBUG
MessageBox.Show(ex.Message);
#endif
}
}