Druckereigenschaften ändern
-
Gibt's eine Möglichkeit die Druckereigenschaften zu ändern? Ich habe schon PrintDlg aufgerufen mit dem Flag PD_PRINTSETUP. Sämtliche Einstellunegn, die ich da durchführe werden ja nicht übernommen (z.B. Querformat). Wie schaffe ich es nun, dass genau das passiert?
-
Wenn du die Auswahl für den Dialog ändern / vorbelegen willst sollte das aber eigentlich schon damit gehen. Zeig doch mal deinen Code dazu
-
Der Code ist nichts besonderes. Ich habe die PrintDlg-Funktion aufgerufen und der PRINTDLG-Struktur den PD_PRINTSETUP - Flag an der entsprechenden Stelle übergeben. Wie gesagt: Der Dialog erscheint dann, aber es werden keine Einstellungen (systemweit) übernommen, wenn ich zur Laufzeit Druckereigenschaften ändere. Könnten mir in diesem Zusammenhang die Funktionen DocumentProperties bzw. PrinterProperties und SetPrinter was bringen?
-
Willst du jetzt systemweit dauerhaft Einstellungen ändern, oder nur für deinen Druckvorgang Voreinstellungen im Druck-Dialog machen
-
Es sollte schon systemweit geändert werden. Ich orientiere mich an einem kommerziellen Batch&Print Programm, das verschiedene Formate ausdrucken kann (z.B. pdf oder doc). Dieses Programm nutzt einen Befehl wie z.B. "acrord32 /p /h C:\PDF.pdf" um PDFs zu drucken (Dies ist ein normaler Befehl, den man auch unter Start -> Ausführen eingeben könnte). Man kann auch Druckeinstellungen in einem Dialog des Programms vornehmen (Genau der Dialog, der mit PD_PRINTSETUP erscheinen würde). Die dort getätigten Einstellungen (z.B. Querseite) werden für den jeweiligen Drucker systemweit übernommen. Anders ließe sich ein solches Programm auch nicht realisieren, da man von außen nicht an den Druckdialog von beispielsweise Adobe Reader rankommt.
-
So wirklich Ahnung habe ich da leider auch nicht, aber schau dir mal SetPrinter und SetPrinterData(Ex) an.
-
Habe mich mal ein wenig an die von dir vorgeschlagenen Funktionen rangetastet. Jetzt bleibt ich aber hängen: GetLastError liefert 5. Was ist das für ein Fehler?
#include <windows.h> #include <iostream.h> main() { HANDLE hPrinter; DWORD rueckwert; PRINTER_INFO_2 *prtinfo; ULONG *Needed; druckername = "IBM NP17PRT03"; if (OpenPrinter(druckername, &hPrinter ,NULL) == false) { cout << "Fehler"; return(0); } else cout << "Handle des Druckers: " << hPrinter << "\n \n"; GetPrinter(hPrinter, 2, NULL, NULL, Needed); prtinfo = (PRINTER_INFO_2 *) GlobalAlloc(GPTR, *Needed); if (GetPrinter(hPrinter, 2 , (LPBYTE) prtinfo, *Needed, Needed) == true) { cout << "Druckereinstellungen erfoglreich ermittelt: \n"; cout << "--------------------------------------------\n"; cout << "Druckername: " << prtinfo->pPrinterName << "\n"; if (prtinfo->Attributes == PRINTER_ATTRIBUTE_LOCAL) cout << "Attribute: Lokaler Drucker \n"; else cout << "Attribute: Remote Drucker \n"; } else { cout << "Fehler: " << "Braucht: " << *Needed; return(0); } //Struktur wird unverändert übergegen (Test) if(SetPrinter(hPrinter, 2, (LPBYTE) prtinfo, 0) == true) { cout << "Erfoglreich"; } else cout << "Fehlschlag: " << GetLastError(); }
-
GetLastError liefert 5?
5 bedeutet "Zugriff verweigert"
-
Falls du NT,2K oder XP hast kannst du das ganze zum Testen mal unter dem Admin-User testen
-
Als Administrator kann ich mich leider nicht anmelden.
Aber ich habe mal versucht die Orientation des Druckers (z.B. Querseite) zu ändern und habe dan folgenden Code eingefügt:
devmode = prtinfo->pDevMode; cout << "Copies: " << devmode->dmCopies << "\n"; cout << "Duplex: " << devmode->dmDuplex << "\n"; cout << "Orientation: " << devmode->dmOrientation << "\n"; //Querformat devmode->dmOrientation = 2; cout << "Orientation: " << devmode->dmOrientation << "\n"; SetPrinter(hPrinter, 2, (LPBYTE) prtinfo, 0);
Die Funktion meldet zwar immer noch den selben Fehler, aber die Eigenschaft wird tatsächlich auf "Querseite" umgestellt. Ich kanns mit zwar nicht erklären, aber wenns funktioniert, soll mir das genügen.