1
A
回答
2
要顯示PrinterSettings對話框使用
[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,
ref IntPtr pDevModeInput,
int fMode);
[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);
private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings) {
var handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
var hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
var pDevMode = GlobalLock(hDevMode);
var sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, ref pDevMode, 0);
var devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
// Show this dialog.
var printQueue = LocalPrintServer.GetDefaultPrintQueue();
var settings = new PrinterSettings { PrinterName = printQueue.FullName };
OpenPrinterPropertiesDialog(settings);
3
因爲我沒有足夠的守信編輯接受的答案,我會發布,而不是第二個答案...
接受的答案工作正常顯示本地打印機對話框並從該對話框中獲取更改。但是,它不會正確地在對話框中設置屬性。
爲了將設置推送到本地對話框,必須按如下方式更改DocumentProperties的簽名。新簽名不使用ref參數作爲輸入。
Here is the page這表明了這個小而顯着的差異。
[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, //removed ref
int fMode);
相關問題
- 1. CUPS打印機不顯示在打印機對話框中
- 2. 打印前顯示打印對話框
- 3. 如何將打印指向特定的打印機並且不顯示打印對話框?
- 4. 打印機和打印對話框
- 5. Dispay打印機對話框
- 6. 如何顯示打印對話框
- 7. System.Windows.Forms.WebBrowser.Print()顯示器打印對話框
- 8. AS3:沒有打印對話框/打印設置對話框的打印作業
- 9. 打開打印機對話框
- 10. 如何直接打印Fastreport而不顯示打印對話框
- 11. 如何打印和打印預覽對話框顯示?
- 12. 打印PDF而不顯示它們,但顯示打印對話框
- 13. 對話框顯示對話框圖像配置
- 14. 打印對話框
- 15. 隱藏Hp打印機的Android打印對話框
- 16. 無對話框的鉻打印(默認打印機)Winforms C#
- 17. 將jQuery對話框的內容打印到打印機
- 18. 在主窗口顯示之前打開配置對話框?
- 19. 如何在特定位置顯示自定義對話框?
- 20. 如果打印機對話框取消,那麼不要打印?
- 21. 選擇打印機(帶對話框)將.xls文件打印到
- 22. 在pdfobject中不提示打印對話框的直接打印
- 23. 無需打印對話框打印Android
- 24. 部署的Qt5應用程序不打印或顯示打印對話框
- 25. 打印不顯示打印選項對話框Crystal Report Viewer在我的C#中
- 26. 在MVC中直接打印沒有熱打印機的打印對話框.net
- 27. 如何在不顯示打印對話的情況下打印?
- 28. 加速顯示iText /飛碟生成的PDF打印對話框
- 29. 自定義打印對話框vb6
- 30. 調出打印機設置對話框,並更改保存