मैं प्रिंटर गुण खिड़की लाए बिना प्रिंटर गुण बदलने के लिए सक्षम होने के लिए चाहते हैं ...क्या प्रिंटर सेटिंग्स.GetHdevmode() में एक बग है?
DocumentProperties का उपयोग करना (Winspool.drv से आयात) समारोह अब तक, में नाकाम रही है, क्योंकि यह दबाने के लिए आसान है, जबकि संवाद दिखाने से, ऐसा लगता है कि प्रिंटरसेटिंग द्वारा वापस दिया गया मान। GetHdevmode() प्रिंटर सेटिंग्स को प्रतिबिंबित नहीं कर रहा है जो इसे कॉल कर रहा है, लेकिन इसके बजाय पिछले प्रिंटर गुणों का मान ठीक से लौट रहा है। उदाहरण के लिए, यह मेरे देता गुणों के आखिरी कॉल से पिछले (गलत) मान, मान के स्थान पर यह PrinterSettings से होना चाहिए वस्तु:
IntPtr hdevmode = PrinterSettings.GetHdevmode(PrinterSettings.DefaultPageSettings);
PrinterSettings.SetHdevmode(hdevmode);
PrinterSettings.DefaultPageSettings.SetHdevmode(hdevmode);
तो करता GetHdevmode एक बग है या यह है कि क्या अपने ऐसा करने वाला? क्या इसके लिए सी # काम है या क्या किसी के पास इसके बारे में कोई जानकारी है? मुझे विषय पर जानकारी खोजने के लिए भी कठोर दबाव डाला गया है।
किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।
संपादित करें: मैं इसे किसी समस्या का व्यक्तिगत बनाना नहीं चाहता था, लेकिन उम्मीद है कि इस मामले में सभी जानकारी एक उत्तर प्रदान कर सकती है जो दूसरों के लिए भी उपयोगी समाधान है।
यहां एक सी ++ डीएलएल है जिसे मैंने इस मुद्दे के लिए कामकाज करने के लिए लिखा है। यह वर्तमान में काम नहीं कर रहा है - यह प्रतियों जैसे अन्य स्मृति को बदलता है, और "अंतर्निहित" पेपरसाइज़ को बदलने में सफल नहीं होता है। मैंने सोचा कि मुझे बस इतना करने की ज़रूरत है कि परिवर्तन करने के लिए आउट बफर फ्लैग निर्दिष्ट करें?
extern "C" __declspec(dllexport) DEVMODE* __stdcall GetRealHDevMode(int width, int height, char *printerName, DEVMODE* inDevMode)
{
//declare handles and variables
HANDLE printerHandle;
LPHANDLE printerHandlePointer(&printerHandle);
//get printer handle pointer
OpenPrinter((LPWSTR)printerName, printerHandlePointer, NULL);
//Get size needed for public and private devmode data and declare devmode structure
size_t devmodeSize = DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, NULL, NULL, 0);
DEVMODE* devmode = reinterpret_cast<DEVMODE*>(new char[devmodeSize + sizeof(DEVMODE) + sizeof(inDevMode->dmDriverExtra)]);
//lock memory
GlobalLock(devmode);
//fill the out buffer
DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, devmode, NULL, DM_OUT_BUFFER);
//change the values as required
devmode->dmPaperWidth = width;
devmode->dmPaperLength = height;
devmode->dmPaperSize = DMPAPER_USER;
devmode->dmFields &= ~DM_PAPERSIZE;
devmode->dmFields &= ~DM_PAPERLENGTH;
devmode->dmFields &= ~DM_PAPERWIDTH;
devmode->dmFields |= (DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH);
//input flag on now to put the changes back in
DocumentProperties(NULL, printerHandle, (LPWSTR)printerName, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER);
//unlock memory
GlobalUnlock(devmode);
//return the devmode that was used to alter the settings
return devmode;
}
मैं लगा सी ++ कोड सेटिंग में बदलाव करने के लिए पर्याप्त था, इसलिए सब मैं सी # में क्या यह है:
public PrinterSettings ChangePrinterProperties(PrinterSettings inPrinterSettings)
{
IntPtr TemphDevMode = inPrinterSettings.GetHdevmode(inPrinterSettings.DefaultPageSettings);
IntPtr hDevMode = GetRealHDevMode((int)(inPrinterSettings.DefaultPageSettings.PaperSize.Width * 2.54F),
(int)(inPrinterSettings.DefaultPageSettings.PaperSize.Height * 2.54F),
inPrinterSettings.PrinterName, TemphDevMode);
GlobalFree(hDevMode);
return inPrinterSettings;
}
अद्यतन: अप आदेश dmPaperSize और dmFields साथ थोड़ा बदल दिया है। बेहतर परिणाम; अभी तक काफी नहीं है।
अद्यतन 2: ठीक है, मुझे एक माइक्रोसॉफ्ट पेज मिला जो कहता है कि दस्तावेज गलत है। एमएसडीएन कहते हैं कि जब आप चौड़ाई और ऊंचाई निर्दिष्ट करना चाहते हैं तो dmPaperSize को 0 पर सेट करना है, जबकि Microsoft समर्थन सुधार इसे DMPAPER_USER पर सेट करने के लिए कहता है। http://support.microsoft.com/kb/108924
मैं सी ++ का उपयोग करता हूं। अधिकांश 'DEVMODE' संरचना से संबंधित मुद्दों को मैं या तो से संबंधित हूं 1) समस्याएं पढ़ें - संरचना तक पहुंचने से पहले स्मृति को लॉक नहीं करना या 2) समस्याएं लिखें - 'DEVMODE' सेट करते समय एक नई संरचना नहीं बनाते। HTH। – dirkgently
आपका कोड स्निपेट कोई समझ नहीं लेता है, यह पहले से मौजूद था जो वापस रखता है।एक डिफ़ॉल्ट प्रिंटर चयन समस्या की तरह बदबू आ रही है, लेकिन दी गई जानकारी से कोई सुराग नहीं है। समस्या को बेहतर तरीके से समझाने में आपकी सहायता के लिए अधिक कोड पोस्ट करें या किसी और से पूछें। –
@nobugz: बिल्कुल बिंदु ... इसे सिर्फ वहां वापस डालना चाहिए, लेकिन इसके बजाय यह एक अलग मान देता है, जो इसे बनाने के लिए प्रयुक्त प्रिंटर सेटिंग्स ऑब्जेक्ट को प्रतिबिंबित नहीं करता है, बल्कि प्रिंटर गुणों के लिए अंतिम कॉल को प्रतिबिंबित करता है। यह एक डिफ़ॉल्ट प्रिंटर समस्या नहीं है (यह बोर्ड भर में है)। @dirkgently: मैंने एक सी ++ डीएलएल लिखने की कोशिश की, लेकिन यह बदलने के लिए मैं कोशिश कर रहा था इसके अलावा अन्य स्मृति बदलना समाप्त हो गया। यह सुनिश्चित नहीं था कि मैं क्या गलत कर रहा था, लेकिन ऐसा लगता है जैसे मुझे मेमोरी-लॉकिंग समाधान देखना चाहिए। सलाह के लिये धन्यवाद। :) – Brandi