我正在使用WPF,並且需要讓用戶設置一些打印相關選項,如打印機和打印機屬性(例如,papertray,風景/人像,雙面打印等)。我知道PrintDialog類來獲得PrintQueue和PrintTicket對象。不過,我需要創建I自定義解決方案,並且不能顯示PrintDialog。 我設法獲得可用的PrintQueue對象並讓用戶選擇打印機。我正在努力與打印機屬性。 我的問題是:如何顯示用戶可以在其中設置所選PrintQueue的打印機屬性的對話框(當用戶單擊WPF PrintDialog中的屬性按鈕時顯示的對話框)。如何調用對話框手動設置打印機選項?
5
A
回答
4
找到以下代碼here(減去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);
}
3
如果你的目標的x86彙編和X64的機器上運行,從Pwninstein代碼將無法正常工作:分配devModeData
時,DocumentPropreties
總是會失敗,並返回一個sizeNeeded
的-1,具有LastError
碼13
爲了解決這個問題,無論是確保您指定AnyCPU或者只是改變調用DocumentPropreties
以下幾點:
int sizeNeeded = DocumentProperties(pHandle,
IntPtr.Zero,
printerSettings.PrinterName,
IntPtr.Zero, // This solves it
pDevMode,
fMode);
使用IntPtr.Zero
,而不是一個適當的指針DEVMODE結構看起來不對,但DocumentProperties是第一次調用不會嘗試在該位置修改內存。調用返回的唯一數據是存儲代表打印驅動程序內部參數的設備模式數據所需的內存大小。
參考:
相關問題
- 1. 調出打印機設置對話框,並更改保存
- 2. 打印機和打印對話框
- 3. 安卓打印對話框選項
- 4. vbscript:如何用打印機選擇對話框打印多個文件一次
- 5. 打開打印機對話框
- 6. 如何自動生成設置/選項對話框?
- 7. 如何顯示打印機屬性/首選項對話框並保存更改?
- 8. 如果打印機對話框取消,那麼不要打印?
- 9. 對話框設置首選項摘要
- 10. 打印對話框
- 11. 如何在打印時設置打印機設置PDF
- 12. 如何調用JFreeChart的打印選項
- 13. 如何使用打印對話框打印文檔?
- 14. 如何編程啓用「選項...」按鈕,在MS Word中打印設置對話框
- 15. 無對話框的鉻打印(默認打印機)Winforms C#
- 16. 隱藏Hp打印機的Android打印對話框
- 17. 如何居中java打印對話框
- 18. 如何關閉打印對話框?
- 19. 無需打印對話框打印Android
- 20. 選擇。保持打印機設置
- 21. 顯示打印機特定的配置對話框
- 22. 打印不顯示打印選項對話框Crystal Report Viewer在我的C#中
- 23. 如何在Linux上的GVim中獲取打印機對話框?
- 24. jQuery UI:設置對話框的拖動選項
- 25. 如何顯示打印對話框選擇打印機時使用按鈕,點擊
- 26. 隱藏打印對話框
- 27. jquery手機對話框
- 28. 在編程式打印期間擺脫打印機後臺打印對話框
- 29. 打印紙上的dojo對話框中的所有選項卡
- 30. 如果在打印對話框中單擊取消,如何關閉選項卡?
看到這個問題: http://stackoverflow.com/questions/2437337/how-to-show-printer-properties-preferences-dialog-and -保存更改 – 2010-04-26 07:01:30