6

私はWPFを使用しており、ユーザーがプリンターやプリンターのプロパティ(ペーパートレイ、横向き/縦向き、両面印刷など)などの印刷関連のオプションを設定できるようにする必要があります。PrintQueueオブジェクトとPrintTicketオブジェクトを取得するためのPrintDialogクラスを知っています。ただし、カスタムソリューションを作成する必要があり、PrintDialogを表示できません。利用可能なPrintQueueオブジェクトを取得し、ユーザーがプリンターを選択できるようにしました。プリンタのプロパティに苦労しています。私の質問は、ユーザーが選択したPrintQueueのプリンタープロパティを設定できるダイアログ(ユーザーがWPF PrintDialogの[プロパティ]ボタンをクリックしたときに表示されるダイアログ)を表示するにはどうすればよいですか。

4

2 に答える 2

5

次のコードはここで見つかりました(Window_Loadedイベントを除く)。私はそれをテストしましたが、それは魔法のように機能するようです。PrinterSettingsダイアログを表示する前に、オブジェクトにプリンター名を設定する必要があります。

これがうまくいくことを願っています:

[DllImport("kernel32.dll")]
static extern IntPtr GlobalLock(IntPtr hMem);

[DllImport("kernel32.dll")]
static extern bool GlobalUnlock(IntPtr hMem);

[DllImport("kernel32.dll")]
static extern bool GlobalFree(IntPtr hMem);

[DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);

private const Int32 DM_OUT_BUFFER = 14;

public void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, System.IntPtr pHandle) {
    IntPtr hDevMode = printerSettings.GetHdevmode();
    IntPtr pDevMode = GlobalLock(hDevMode);
    Int32 fMode = 0;
    int sizeNeeded = DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, fMode);
    IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);

    fMode = DM_OUT_BUFFER;

    DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, fMode);
    GlobalUnlock(hDevMode);
    printerSettings.SetHdevmode(devModeData);
    printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
    GlobalFree(hDevMode);
    Marshal.FreeHGlobal(devModeData);
}

private void Window_Loaded(object sender, RoutedEventArgs e) {
    OpenPrinterPropertiesDialog(new PrinterSettings(), new WindowInteropHelper(this).Handle);
}
于 2009-09-13T02:25:15.370 に答える