2016-12-08 14 views
8

मैं एकाधिक प्रिंटर जो नीचे की तरह एक "घुमाएँ 180 डिग्री" चेकबॉक्स शामिल है:नियंत्रण या उपयोग कस्टम प्रिंटर सेटिंग्स (घुमाएँ 180 डिग्री)

enter image description here

यहाँ एक और एक है ("नी" "नहीं" का मतलब है):

enter image description here

वहाँ एक रास्ता प्रोग्राम के रूप में यह मान सेट करने के लिए है, और PrintTicket बदलते हैं? यदि नहीं, तो मैं इसका वर्तमान मूल्य कैसे प्राप्त कर सकता हूं? मेरे सॉफ़्टवेयर के लिए मुझे यह जानने की ज़रूरत है कि यह सेट है या नहीं और यदि यह सेट है, तो यदि संभव हो तो इसे बदलने की जरूरत है। मेरे सॉफ़्टवेयर के लिए यह सबसे अच्छा होगा यदि मुझे प्रिंटडिअलॉग खोलना नहीं है, यह सॉफ़्टवेयर का एक टुकड़ा है जहां उपयोगकर्ता बिना किसी बटन पर क्लिक किए सीधे प्रिंट कर सकते हैं, इसलिए इसे प्रोग्रामेटिक रूप से सेट करना या प्राप्त करना जो मैं ढूंढ रहा हूं।

मैं ManagementObjectSearcher और सामान्य PrintDocument.DefaultPageSettings संपत्ति का उपयोग करके चारों ओर खोज रहा हूं लेकिन कुछ भी नहीं मिला!

यदि यह विकल्प सेट नहीं है, तो मैं स्वचालित रूप से उपयोगकर्ताओं के लिए इसे अस्थायी रूप से सेट करना चाहता हूं (अन्यथा यह मेरे विशेष प्रिंटर के साथ उल्टा प्रिंट करता है)। मैं उपयोगकर्ताओं के लिए इसे सेट करने की कोशिश कर रहा हूं लेकिन मैं यह समझ नहीं सकता कि इसे कैसे काम पर लाया जाए। मैं DEVMODE संरचना को देख रहा हूं और इसे कार्यान्वित करने का प्रयास किया है, लेकिन इसमें "180 डिग्री विकल्प घुमाएं" या कुछ भी समान नहीं है।

नोट: मैं लैंडस्केप मोड सेट करने की कोशिश नहीं कर रहा हूं। यह बहुत आसान है और कुछ अलग है। pdialog.PrintQueue.CurrentJobSettings.CurrentPrintTicket.PageOrientation = PageOrientation.ReversePortrait;

हालांकि, यह केवल पेज अभिविन्यास और नहीं सामग्री (सामग्री के रूप में अच्छी तरह से घुमाया जा करने की जरूरत है) उलट:

मैं निम्न कार्य करने की कोशिश की।

यदि मैं उस दृश्य को घुमाता हूं जिसे मैं प्रिंट कर रहा हूं, तो मार्जिन अभी और सही नहीं हैं ताकि यह काम न करे! उम्मीद है कि कोई मदद कर सकता है।

अग्रिम धन्यवाद।

संपादित

मैं हंस 'विधि का इस्तेमाल किया यह पता लगाने की जो मान बदलने के लिए। ध्यान दें कि उसकी विधि किसी भी प्रकार के प्रिंटर के लिए लागू होगी! devmodePrintDialog के मान को बदलता है। मुझे हल करने में घंटों और घंटे लग गए ताकि जो भी मैं मदद कर सकूं, यहां मेरा कोड है और मुझे साझा करने या मदद करने में खुशी है! सबसे पहले मैं DefaultPrintTicket को new PrintServer() से बदलने की कोशिश कर रहा था जो काम नहीं करता था, लेकिन UserPrintTicket सही प्रतीत होता था जहां आप वास्तव में विंडोज Control Panel if you don't switch back to the original one. *However*, this only seemed to work on just my pc (which was necessary), on a virtual machine for example the जादू मूल्य में मूल्य परिवर्तन पहले ही अलग दिख सकते थे। यह वास्तविक जीवन के उपयोग की तुलना में अभ्यास था।

var pdialog = new PrintDialog(); 

pdialog.PrintQueue = new PrintQueue(new LocalPrintServer(), _printername, PrintSystemDesiredAccess.AdministratePrinter); // this will be your printer. any of these: new PrintServer().GetPrintQueues() 

pdialog.PrintTicket.PageMediaSize = size; 
pdialog.PrintTicket.CopyCount = _amount; 

if (CheckPrinterDriverName(_printername)) 
{ 
    int magic = 361; 
    var defaulttckt = pdialog.PrintQueue.UserPrintTicket; 
    pdialog.PrintQueue.UserPrintTicket = PrinterModifier.ChangeDevMode(pdialog, magic, vis); 
    pdialog.PrintQueue.Commit(); 
    pdialog.PrintVisual(vis, "Label"); 
    //Set back old settings so it's not permanently changed 
    pdialog.PrintQueue.UserPrintTicket = defaulttckt; 
    pdialog.PrintQueue.Commit(); 
} 

...

class PrinterModifier 
{ 
    public static PrintTicket ChangeDevMode(PrintDialog pdialog, int prpty, DrawingVisual vis) 
    { 
     var queue = pdialog.PrintQueue; 
     var cvt = new PrintTicketConverter(queue.Name, PrintTicketConverter.MaxPrintSchemaVersion); 
     // Display dialog, don't make changes 

     var devmode1 = cvt.ConvertPrintTicketToDevMode(pdialog.PrintTicket, BaseDevModeType.UserDefault); 
     // Consistency check 
     var dmSize = BitConverter.ToInt16(devmode1, 68); 
     var dmDriverExtra = BitConverter.ToInt16(devmode1, 70); 

     if (devmode1[361] == 0) 
     { 
      devmode1[361] = 1; 
     } 
     return cvt.ConvertDevModeToPrintTicket(devmode1, PrintTicketScope.PageScope); 
    } 
} 

printdialog परिवर्तन में मूल्य, लेकिन यह अभी भी गलत प्रिंट करता है। परिवर्तन लागू नहीं होते हैं। किसी भी मदद का स्वागत है!

+0

क्या आप इसे स्वचालित रूप से 180 डिग्री आकर्षित नहीं कर सकते? –

+0

@ डैनियलए। व्हाइट मेरे अपडेट की जांच करें, उम्मीद है कि इससे थोड़ा और स्पष्ट हो जाएगा कि मुझे इसकी पहुंच क्यों है! – Markinson

+0

एक एक्स-वाई समस्या की तरह लगता है। –

उत्तर

7

यह शायद महसूस करने के लिए कैसे असामान्य इस संपत्ति है मदद करता है। मिथुन अंतरिक्ष कार्यक्रम के लिए नासा द्वारा भर्ती एक अंतरिक्ष यात्री पीट कॉनराड के बारे में परिचय के रूप में मजेदार सच्ची कहानी। कोई वास्तविक विचार नहीं है कि कितनी लंबी अवधि की अंतरिक्ष उड़ान मनुष्यों को प्रभावित करती है, डॉक्टरों ने उन्हें मूल रूप से कुछ भी प्रकट किया जो वे सोच सकते थे। अक्सर बहुत घुसपैठ और असहज परीक्षण। कॉनराड विद्रोह और एक मनोवैज्ञानिक परीक्षण में विफल रहा। डॉक्टर ने उन्हें एक खाली कार्ड दिया और पूछा "तुम क्या देखते हो?" उसने तुरंत इसे वापस फेंक दिया और टिप्पणी की "यह उल्टा है"।

यह प्रिंटर असामान्य है, हमेशा चिंता करने के लिए कुछ। शायद एक उत्पादन लाइन पर काम करने के लिए डिज़ाइन किया गया है जिसमें कुछ प्रकार के स्वचालित पेपर बाइंडिंग ऑपरेशन शामिल हैं। प्रिंटर ड्राइवर मनमाने ढंग से अपने व्यवहार को अनुकूलित करने के लिए गुण जोड़ सकते हैं, यह एक ऐसी संपत्ति है। जिस संपत्ति शीट को आप देख रहे हैं वह समान रूप से गैर-मानक है, यह प्रिंटर ड्राइवर से आता है।

यह समझने के लिए कि आप इस सेटिंग को कैसे बदल सकते हैं, आपको सबसे पहले the DEVMODE structure समझने की आवश्यकता है। Winapi में उपयोग की जाने वाली सबसे उग्र संरचना के बारे में। यह एक परिवर्तनीय आकार संरचना है, एमएसडीएन पृष्ठ में जो घोषणा आप देखते हैं वह केवल मानक गुणों को कवर करती है। एक प्रिंटर ड्राइवर मनमाने ढंग से इसे बढ़ा सकता है, dmDriverExtra फ़ील्ड ट्रैक करता है कि कितने अतिरिक्त बाइट जोड़े गए थे। dmSize फ़ील्ड संरचना के गैर-परिवर्तनीय भाग के आकार की रिपोर्ट करता है, यह विंडोज संस्करण 6 (Vista और ऊपर) पर 220 है। आपको कुछ जांचने की ज़रूरत है।

विनफॉर्म सीधे प्रिंटरसेटिंग.GetHdevmode() विधि के साथ DEVMODE का खुलासा करता है। डब्ल्यूपीएफ इसे प्रिंटटिकेट कक्षा के माध्यम से हटा देता है। प्रिंटटिकेट से DEVMODE और वापस कनवर्ट करने के लिए आपको PrintTicketConverter class का उपयोग करना होगा।

आपको रिवर्स-इंजीनियर की आवश्यकता है जो निजी ड्राइवर डेटा में सटीक फ़ील्ड है जो इस सेटिंग को संग्रहीत करता है। केवल प्रिंटर निर्माता ही यह जानकारी जानता है, वे आपके फोन कॉल का जवाब नहीं दे रहे हैं। कुछ नमूना कोड आप को खोजने में मदद करने के लिए और कहा कि क्षेत्र की पुष्टि, बस MainWindow निर्माता में एक do-कुछ भी नहीं WPF अनुप्रयोग में इसे आज़माने:

using System.Printing;   // Add reference to System.Printing 
using System.Printing.Interop; // Add reference to ReachFramework 
using System.Diagnostics; 
.... 

    public MainWindow() { 
     InitializeComponent(); 
     // Assume default printer 
     var queue = new LocalPrintServer().DefaultPrintQueue; 
     var cvt = new PrintTicketConverter(queue.Name, PrintTicketConverter.MaxPrintSchemaVersion); 
     // Display dialog, don't make changes 
     var dlg = new PrintDialog(); 
     dlg.ShowDialog(); 
     var devmode1 = cvt.ConvertPrintTicketToDevMode(dlg.PrintTicket, BaseDevModeType.UserDefault); 
     // Consistency check 
     var dmSize = BitConverter.ToInt16(devmode1, 68); 
     var dmDriverExtra = BitConverter.ToInt16(devmode1, 70); 
     Debug.Assert(dmSize == 220); 
     Debug.Assert(dmDriverExtra > 0); 
     Debug.Assert(dmSize + dmDriverExtra == devmode1.Length); 
     // Display dialog again, do make the change 
     dlg.ShowDialog(); 
     var devmode2 = cvt.ConvertPrintTicketToDevMode(dlg.PrintTicket, BaseDevModeType.UserDefault); 
     var len = Math.Min(devmode1.Length, devmode2.Length); 
     for (int ix = 0; ix < len; ++ix) { 
      if (devmode1[ix] != devmode2[ix]) { 
       Debug.Print("Change at {0} from {1} to {2}", ix, devmode1[ix], devmode2[ix]); 
      } 
     } 
     // Tinker with the DEVMODE... 
     var magic = dmSize + 0; // Change this 
     Debug.Assert(magic < dmSize + dmDriverExtra); 
     devmode1[magic] = devmode2[magic]; 
     dlg.PrintTicket = cvt.ConvertDevModeToPrintTicket(devmode1); 
     // Verify that the setting changed! 
     dlg.ShowDialog(); 
    } 
} 

खबरदार है कि आप कई बाइट परिवर्तन देख सकते हैं। सबसे अधिक संभावना अनुमान है कि आप 0 से 1 में परिवर्तन करने वाले व्यक्ति की तलाश करेंगे। डीबग> विंडोज> मेमोरी> मेमोरी 1 विंडो स्ट्रिंग द्वारा उत्पादित शोर को फ़िल्टर करने के लिए उपयोगी हो सकती है, पता फ़ील्ड में "devmode2" डालें।

अपेक्षित परिणाम यह है कि अब आप प्रिंटटिकेट को कस्टमाइज़ करना चाहते हैं। सावधान रहें कि यह उस प्रिंटर के लिए बेहद विशिष्ट है और ड्राइवर अद्यतन के साथ बदल सकता है। तो आप इसे LayoutTransform property के साथ मुद्रित करने के लिए दृश्य को घूर्णन करने, सबसे तार्किक तरीके से करने पर विचार कर सकते हैं।

+0

आपकी 670k प्रतिष्ठा निश्चित रूप से किसी कारण से नहीं है ... कोड का बड़ा टुकड़ा! एक चीज है जो मुझे अभी तक नहीं मिलती है। आउटपुट कहता है कि अगर मैं चेकबॉक्स पर क्लिक करता हूं तो 361 पर 0 से 1' पर बदलें (जो मुझे लगता है कि यह होना चाहिए !!)। हालांकि, जब मैं लाइन को 'var magic = dmSize + 361' में बदलता हूं तो कुछ भी नहीं बदलता है। लेकिन जब मैं अपना कोड 'devmode1 = devmode2' में बदलता हूं तो मुझे अपेक्षित परिणाम मिलते हैं। मुझे 'var magic = dmSize + 0' के साथ क्या करना चाहिए? मुझे लगता है कि मैं उस रेखा को गलत या कुछ समझता हूं। – Markinson

+0

क्षमा करें, यह और अधिक स्पष्ट हो सकता था। 'Var magic = 361;' –

+0

का उपयोग करें नौकरी, आपकी मदद और स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – Markinson

-1

क्या आपने प्रिंट स्पूलर एपीआई की कोशिश की है?

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162863(v=vs.85).aspx

Pinvoke.net सी # में एक dll से फोन करने के लिए सी # वाक्य रचना को दर्शाता है।

एक उदाहरण सी # में एक संवाद खोलने के लिए:

http://hintdesk.com/c-invoke-printer-properties-dialog/

1

यह प्रयास करें। "लैंडस्केपएंगल" प्रिंट संवाद नियंत्रण में अभिविन्यास सेट वापस कर देगा।

PrintDialog.PrinterSettings.LandscapeAngle 

रेफरी: https://msdn.microsoft.com/en-us/library/system.drawing.printing.printersettings(v=vs.110).aspx

+0

समझ में आता है तो यह काम नहीं करता है। लैंडस्केप कोण "180 डिग्री घुमाएं" चेकबॉक्स से अलग है। – Markinson

संबंधित मुद्दे