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. 如何將打印指向特定的打印機並且不顯示打印對話框?
- 2. 打印機和打印對話框
- 3. System.Windows.Forms.WebBrowser.Print()顯示器打印對話框
- 4. 打開打印機對話框
- 5. 如何直接打印Fastreport而不顯示打印對話框
- 6. 打印對話框
- 7. 在主窗口顯示之前打開配置對話框?
- 8. 無對話框的鉻打印(默認打印機)Winforms C#
- 9. 隱藏Hp打印機的Android打印對話框
- 10. 如果打印機對話框取消,那麼不要打印?
- 11. 在pdfobject中不提示打印對話框的直接打印
- 12. 打印不顯示打印選項對話框Crystal Report Viewer在我的C#中
- 13. 無需打印對話框打印Android
- 14. 加速顯示iText /飛碟生成的PDF打印對話框
- 15. 自定義打印對話框問題
- 16. 調出打印機設置對話框,並更改保存
- 17. 如何調用對話框手動設置打印機選項?
- 18. 打印網頁時未顯示打印對話框和此網頁
- 19. Windows.print顯示打印對話框但在火狐中打印空白頁面
- 20. 如何在C#中打印Word文檔而不顯示打印對話框
- 21. 隱藏打印對話框
- 22. 顯示具有特定名稱的打印機
- 23. 在編程式打印期間擺脫打印機後臺打印對話框
- 24. 如何在Windows CE Direct-X應用程序中顯示(打印機)對話框?
- 25. 如何顯示打印機屬性/首選項對話框並保存更改?
- 26. printdialog.showdialog();沒有顯示在Windows 7 64位打印對話框
- 27. 強制瀏覽器不顯示打印對話框
- 28. 通過提示配置打印機的重定向端口
- 29. 如何顯示打印對話框選擇打印機時使用按鈕,點擊
- 30. 如何顯示打印對話框並在同一屏幕上顯示預覽