Comment faire pour afficher les propriétés de l'imprimante/boîte de dialogue préférences et enregistrer les modifications?

EDIT: Ma faute! J'ai attendu les modifications de paramètres d'imprimante par défaut alors qu'en fait, seule l'instance locale de la PrinterSettings sont modifiées. - Le code ci-dessous semble fonctionner comme prévu

Je suis en train d'essayer de montrer la coutume des propriétés de l'imprimante de l'imprimante. J'ai besoin de cela comme un élément d'une coutume PrintDialog qui je suis en train d'écrire.

La plupart des exemples que je peux trouver en ligne gérer pour afficher la boîte de dialogue, mais tous les changements que l'utilisateur sont perdues, ce qui le rend inutilisable.

Exemple:
http://www.codeproject.com/KB/system/PrinterPropertiesWindow.aspx

(concernant la page mentionnée ci-dessus: j'ai essayé de changer le code, tel que suggéré par BartJoy (sur la page), mais qui n'ont pas le fixer)

J'ai aussi essayé de l'échantillon et des suggestions sur la pinvoke.net la page mais cela ne fonctionne toujours pas:

http://www.pinvoke.net/default.aspx/winspool.documentproperties

De les sites ci-dessus, je suppose que le problème est peut-être seulement en 64 bits de Windows et/ou si un nom d'imprimante plus de 32 caractères.

Je ne sais pas ce que je devrais essayer la prochaine... j'apprécie tous les commentaires et suggestions!

EDIT: Voici ce que j'ai essayé:

[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);
[DllImport("winspool.drv")]
private static extern int OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
[DllImport("winspool.drv")]
private static extern int ClosePrinter(IntPtr phPrinter);
[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 const int DM_PROMPT = 4;
private const int DM_OUT_BUFFER = 2;
private const int DM_IN_BUFFER = 8;
private void OpenPrinterPropertiesDialog()
{
var printerSettings = new System.Drawing.Printing.PrinterSettings();
var printerName = printerSettings.PrinterName;
IntPtr handle;
OpenPrinter(printerName, out handle, IntPtr.Zero);
IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(hDevMode);
int sizeNeeded = DocumentProperties(this.Handle, handle, printerName, pDevMode, pDevMode, 0);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(this.Handle, handle, printerName, devModeData, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER);
ClosePrinter(handle);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}

J'ai essayé d'utiliser le OpenPrinter et ClosePrinter méthode et passer le devModeData tant que paramètre de sortie dans le deuxième appel que j'ai trouvé étrange que le code d'origine de l'pinvoke.net ne pas le faire. (mais j'avoue, que je ne sais pas ce que je fais - c'est juste essai et erreur).

Voici le code original du pinvoke site:

private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
{
IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(hDevMode);
int sizeNeeded = DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, 0);
IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 14);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
Et comment avez-vous réussi à obtenir les changements enregistrés en arrière? Ce code ne changer la printerSettings mais les modifications ne sont pas enregistrées comme des imprimantes par défaut des paramètres 🙁

OriginalL'auteur |