Tôi đang sử dụng WPF và cần cho phép người dùng đặt một số tùy chọn liên quan đến in như máy in và thuộc tính máy in (ví dụ: papertray, landscape/portrait, duplex, v.v ...). Tôi biết về lớp PrintDialog để lấy đối tượng PrintQueue và PrintTicket. Tuy nhiên tôi cần phải tạo giải pháp tùy chỉnh và không thể hiển thị PrintDialog. Tôi quản lý để nhận các đối tượng PrintQueue có sẵn và cho phép người dùng chọn máy in. Tôi đang đấu tranh với các thuộc tính máy in. Câu hỏi của tôi là: làm cách nào tôi có thể hiển thị hộp thoại trong đó người dùng có thể đặt thuộc tính máy in cho PrintQueue đã chọn (hộp thoại được hiển thị khi người dùng nhấp vào nút Thuộc tính trong WPF PrintDialog).Làm cách nào để tôi có thể gọi hộp thoại để đặt tùy chọn máy in theo cách thủ công?
Trả lời
Mã sau được tìm thấy here (trừ sự kiện Window_Loaded
). Tôi đã thử nghiệm nó và nó có vẻ hoạt động như một sự quyến rũ. Rõ ràng bạn sẽ phải đặt tên máy in trong đối tượng PrinterSettings
trước khi hiển thị hộp thoại.
Hy vọng điều này làm việc cho bạn:
[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);
}
Nếu bạn nhắm mục tiêu x86 biên soạn và chạy từ một máy x64, mã từ Pwninstein sẽ không hoạt động: khi phân bổ devModeData
, DocumentPropreties
sẽ luôn luôn thất bại và trả về một sizeNeeded
của -1, với một mã LastError
13.
để giải quyết vấn đề, hoặc đảm bảo bạn nhắm mục tiêu AnyCPU hoặc chỉ cần thay đổi các cuộc gọi đến DocumentPropreties
như sau:
int sizeNeeded = DocumentProperties(pHandle,
IntPtr.Zero,
printerSettings.PrinterName,
IntPtr.Zero, // This solves it
pDevMode,
fMode);
Sử dụng IntPtr.Zero
thay vì một con trỏ thích hợp để một cấu trúc devmode trông sai, nhưng mà cuộc gọi đầu tiên để DocumentProperties không cố gắng để thay đổi bộ nhớ tại vị trí đó. Dữ liệu duy nhất được trả về bởi cuộc gọi là kích thước bộ nhớ cần thiết để lưu trữ dữ liệu chế độ thiết bị đại diện cho các tham số bên trong của trình điều khiển in.
tham khảo:
- 1. Làm cách nào để đặt loại đầu vào nút theo cách thủ công trong ASP.NET?
- 2. Bạn làm cách nào để chèn các tùy chọn theo cách thủ công vào boost.Program_options?
- 3. Làm cách nào để nhận tùy chọn "Thuộc tính trang" trong hộp thoại in Cocoa?
- 4. Tôi làm cách nào để hiển thị Hộp thoại từ Tùy chọn ưu tiên?
- 5. Tôi làm cách nào để gọi Action theo cách thủ công?
- 6. Có thể cài đặt socket.io theo cách thủ công?
- 7. Hộp danh sách thả xuống gwt có thể có các giá trị theo cách thủ công?
- 8. Làm cách nào để tôi có thể bật hoặc tắt phím Quay lại theo cách thủ công trên bàn phím?
- 9. Làm cách nào để tạo TypeTag theo cách thủ công?
- 10. args4j: trong "cách sử dụng" cách sắp xếp Tùy chọn theo cách thủ công?
- 11. Làm cách nào để thay đổi tùy chọn Có/Không trong hộp thoại xác nhận?
- 12. Tôi cần có hộp thoại tùy chỉnh trong Tuỳ chọn
- 13. Làm cách nào để tạo Hộp thoại tùy chỉnh 100%
- 14. Làm cách nào để cài đặt mô-đun XS theo cách thủ công?
- 15. Làm cách nào để in trực tiếp, không có Hộp thoại In trong WPF?
- 16. SignalR - Đặt ClientID theo cách thủ công
- 17. Làm cách nào để biết liệu máy in có in được không?
- 18. Làm cách nào để đặt tiêu đề REFERER theo cách thủ công trong Javascript?
- 19. Có cách nào để gọi thủ công sự kiện "Nhập khóa" trên hộp văn bản không?
- 20. Làm cách nào để tạo Yêu cầu HTTP theo cách thủ công trong .Net?
- 21. Tôi làm cách nào để tạo khác biệt thủ công?
- 22. Làm cách nào để tôi có thể chạy tác vụ định kỳ cần tây từ vỏ theo cách thủ công?
- 23. Làm cách nào để tôi có thể thực hiện Play! Giao dịch JPA theo cách thủ công?
- 24. Tôi làm cách nào để chèn danh tính theo cách thủ công?
- 25. Tôi làm cách nào để tạo hộp thoại tùy chỉnh với hai bộ đếm ngày?
- 26. Cách tạo Hộp thoại để nhắc người dùng có tùy chọn Có/Không trong WPF
- 27. Làm cách nào để in trang HTML ở chế độ ngang khi người dùng chọn 'in'?
- 28. Làm cách nào để "đăng nhập người dùng" theo cách thủ công bằng WebSecurity + SimpleMembership?
- 29. Làm cách nào để thêm cookie theo cách thủ công vào một phiên có cookie được đặt cơ giới hóa?
- 30. Làm cách nào để đặt phông chữ tùy chỉnh cho hộp thoại cảnh báo trong Android?
Xem câu hỏi này: http://stackoverflow.com/questions/2437337/how-to-show-printer-properties-preferences-dialog-and -lưu thay đổi –