2012-10-11 11 views
5

से नियंत्रण वर्णों को हटा रहा है मेरे पास डेटा ग्रिड वाला एक WPF विंडो है। मैं एक प्रतीक स्कैनर से कैप्चर करने की कोशिश कर रहा हूं, एक स्ट्रिंग जिसे वर्चुअल वेज के माध्यम से भेजा जा रहा है। एप्लिकेशन के लिए ऐसा लगता है कि वर्ण टाइप किए गए थे। यह स्ट्रिंग ASCII 1 (SOH) से शुरू होती है।डेटाग्रिड पूर्वावलोकनTextInput ईवेंट इनपुट

जब खिड़की पर ध्यान केंद्रित किया गया है विंडो के पूर्वावलोकन टेक्स्टक्स्टपुट को अन्य सभी मानव पठनीय और गैर-मानव पठनीय मूल्यों के साथ एसओएच प्राप्त होता है। हालांकि, जब डेटाग्रिड ने गैर-मानव पठनीय पात्रों पर ध्यान केंद्रित किया है तो उन्हें हटा दिया गया है।

यदि मेरे पास विंडो पर पूर्वावलोकनकेडडाउन या पूर्वावलोकनकेप है तो अक्षरों को ठीक से दिखाई देने पर कोई फर्क नहीं पड़ता। तो कहीं भी डेटा ग्रिड इसे बाहर स्ट्रिप्स के साथ। दुर्भाग्यवश क्योंकि KeyDown/KeyUp ASCII वर्ण नहीं दिखाता है, मैं इन घटनाओं का उपयोग कुछ प्रकार के पार्सिंग एल्गोरिदम लिखने के बिना नहीं कर सकता।

क्या कोई मुझे बता सकता है कि मैं उन गैर-मानव पठनीय नियंत्रण वर्णों को हमेशा पूर्वावलोकनTextInput पर भेजने के लिए क्या कर सकता हूं? या पूर्वावलोकनकिडाउन में सभी पात्रों को कैसे पार्स करें?

संपादित:

खिड़की ध्यान केंद्रित है जब:

Window PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
Window PreviewTextInput - <SOH> 
Window PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
Window PreviewTextInput - C 

जब डेटा ग्रिड ध्यान केंद्रित किया है:

Window PreviewKeyDown - LeftCtrl 
DataGrid PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
DataGrid PreviewKeyDown - A 
Window PreviewKeyDown - Oem6 
DataGrid PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
DataGrid PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
DataGrid PreviewKeyDown - C 
Window PreviewTextInput - C 
+0

मेरा उत्तर के बारे में कोई सोचा? क्या इसने सहायता की? – Alan

उत्तर

1

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

क्या आपने ऐसा कुछ करने का प्रयास किया है?

MSDN मंचों पर इस पोस्ट में प्रासंगिक (Converting Key To ASCII

बार कोड पाठकों आमतौर पर दो रूपों में काम कर सकते हैं लगता है। एक यह है जहां यह एक कुंजीपटल कील के रूप में कार्य करता है, कीस्ट्रोक्स पैदा करने के रूप में यद्यपि उपयोगकर्ता कोड लिखा था। एक और वह जगह है जहां एक एप्लिकेशन प्रोग्राम आमतौर पर एक सीरियल पोर्ट के माध्यम से स्कैन किए गए कोड को प्राप्त करता है। आपको पाठक को एक मोड में स्विच किया गया है जहां यह बाद के तरीके के लिए उपयुक्त कोड उत्पन्न करता है। Ctrl + B एक नियंत्रण कोड है, SOH (प्रारंभ हेडर)। इसका उपयोग पाठक के साथ प्रोग्राम को सिंक्रनाइज़ करने के लिए किया जाता है, एसओएच स्कैन की शुरुआत को इंगित करता है, आप इसे बफर इंडेक्स रीसेट करने के लिए उपयोग करेंगे।

आप कीबोर्ड वेज मोड के लिए पाठक को कॉन्फ़िगर करना चाहते हैं जहां यह नियंत्रण वर्ण उत्पन्न नहीं करेगा। स्कैन कोड का पता लगाने के लिए, एसओएच का पता लगाने के लिए, और एक कुंजी दबाए गए ईवेंट हैंडलर को लिखकर, यदि आवश्यक हो तो भी आप इसे काम कर सकते हैं। KeyDown में वर्णों में दिखाई देने वाले प्रमुख स्ट्रोक को कन्वर्ट करने का प्रयास करने से बचें, KeyPressed पहले से ही आपके लिए यह करता है।

मेरा मानना ​​है कि यह आप ASCII कन्वर्ट करने के लिए के लिए काम कर सकते हैं:

[DllImport("user32.dll")] 
    static extern int ToAsciiEx(uint uVirtKey, uint uScanCode, byte[] lpKeyState, byte[] arr, uint uFlags, IntPtr hkl); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetKeyboardState(byte[] lpKeyState); 


    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     byte[] keyboardState = new byte[256]; 
     int keyCode = KeyInterop.VirtualKeyFromKey(e.Key); 
     byte[] arr = new byte[4]; 
     GetKeyboardState(keyboardState); 
     Debug.WriteLineIf(ToAsciiEx((uint)keyCode, 0, keyboardState, arr, 0, IntPtr.Zero) > 0, ASCIIEncoding.ASCII.GetString(arr)); 
    } 
संबंधित मुद्दे