Sto utilizzando WPF e devo consentire agli utenti di impostare alcune opzioni relative alla stampa come proprietà stampante e stampante (ad esempio papertray, orizzontale/verticale, duplex, ecc.). Sono a conoscenza della classe PrintDialog per ottenere un oggetto PrintQueue e PrintTicket. Tuttavia, ho bisogno di creare una soluzione personalizzata e non posso mostrare PrintDialog. Sono riuscito a ottenere gli oggetti PrintQueue disponibili e consentire agli utenti di selezionare una stampante. Sto lottando con le proprietà della stampante. La mia domanda è: come posso mostrare la finestra di dialogo in cui un utente può impostare le proprietà della stampante per il PrintQueue selezionato (la finestra di dialogo che viene mostrata quando un utente fa clic sul pulsante Proprietà nel PrintDialog di WPF).Come posso richiamare la finestra di dialogo per impostare manualmente le opzioni della stampante?
Come posso richiamare la finestra di dialogo per impostare manualmente le opzioni della stampante?
risposta
Il seguente codice è stato trovato here (meno l'evento Window_Loaded
). L'ho provato e sembra funzionare come un fascino. Ovviamente dovrai impostare il nome della stampante nell'oggetto PrinterSettings
prima di visualizzare la finestra di dialogo.
Spero che questo funziona per voi:
[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);
}
Se il target di compilazione x86 ed eseguire da una macchina x64, il codice da Pwninstein non funziona: in sede di assegnazione devModeData
, DocumentPropreties
avrà sempre esito negativo e restituisce un sizeNeeded
di -1, con un codice LastError
13.
per risolvere il problema, assicurarsi che si target AnyCPU o semplicemente cambiare la chiamata a DocumentPropreties
al seguente:
int sizeNeeded = DocumentProperties(pHandle,
IntPtr.Zero,
printerSettings.PrinterName,
IntPtr.Zero, // This solves it
pDevMode,
fMode);
Utilizzando IntPtr.Zero
invece di una vera e propria puntatore a una struttura DEVMODE sembra sbagliato, ma che prima chiamata a DocumentProperties non tentare di modificare la memoria in quella posizione. L'unico dato restituito dalla chiamata è la dimensione della memoria necessaria per memorizzare i dati della modalità dispositivo che rappresentano i parametri interni del driver di stampa.
Riferimento:
- 1. Come impostare l'icona per la finestra di dialogo in Android
- 2. Come posso richiamare manualmente un'azione in swing?
- 3. Come posso impostare le opzioni predefinite (globali) per gli helper?
- 4. Come ottenere le dimensioni della finestra di dialogo?
- 5. Come impostare la convalida nulla nella finestra di dialogo edittextpreference
- 6. Come richiamare manualmente un evento?
- 7. Come si fa a richiamare la finestra di dialogo Autorizzazioni di Windows a livello di programmazione?
- 8. Voglio impostare l'altezza massima nel frammento della finestra di dialogo
- 9. Come posso impostare le dimensioni della finestra di una finestra di stampa?
- 10. Impostare il colore di sfondo per la barra del titolo della finestra di dialogo?
- 11. args4j: in "utilizzo" come ordinare le opzioni manualmente?
- 12. Android - MediaController di VideoView all'interno della finestra di dialogo appare dietro la finestra di dialogo
- 13. wix finestra di dialogo personalizzata per la modifica della configurazione
- 14. Come pulsanti della finestra di dialogo stile Holo per Android
- 15. Rimozione della finestra di dialogo della licenza
- 16. Posso impostare programmaticamente le opzioni di configurazione di Mercurial?
- 17. Come posso visualizzare la finestra di dialogo jquery test unitario?
- 18. Come ottenere la finestra di dialogo jQueryui scrollTop per scorrere il contenuto della finestra di dialogo in alto
- 19. Come impostare il nome file della risposta senza forzare la finestra di dialogo saveas
- 20. Come impostare il carattere personalizzato per la finestra di dialogo di avviso in Android?
- 21. Cosa rende una buona finestra di dialogo opzioni/impostazioni?
- 22. Come aprire la finestra di dialogo "Opzioni prestazioni" dalla riga di comando o chiamata di sistema
- 23. Risultato della finestra di dialogo C# MessageBox
- 24. Come richiamare la finestra di dialogo "Windows non può aprire questo file"?
- 25. Finestra di dialogo dell'interfaccia utente jQuery - La finestra esterna scorre mentre scorre all'interno della finestra di dialogo
- 26. Come impostare le opzioni JSHint per base di directory
- 27. Come impostare le opzioni di default per gdb?
- 28. Riportare la stringa dal frammento della finestra di dialogo all'attività
- 29. Come impostare una larghezza di animazione a tema della finestra di dialogo?
- 30. Come gestire una finestra di dialogo per confermare la webview?
Vedere questa domanda: http://stackoverflow.com/questions/2437337/how-to-show-printer-properties-preferences-dialog-and -Salva I Cambiamenti –