2008-12-10 10 views
16

यह एक Windows फार्म में एक डॉस कंसोल या में उपयोगकर्ता नियंत्रण सी # 2.0 एम्बेड करने के लिए संभव है?एक विंडोज़ रूप में एक डॉस सांत्वना एम्बेड

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

फिलहाल, मैं उस डिवाइस का पता लगाने के लिए user32.dll का उपयोग कर रहा हूं जिसमें डॉस उत्पाद चल रहा है, विंडो को अधिकतम करने और खिड़की में अक्षरों को टाइप करने के लिए छोटा करना। यह समस्या का बहुत अच्छा समाधान नहीं है, क्योंकि इसका मतलब है कि मेरे एप्लिकेशन को एप्लिकेशन सेटिंग्स में विंडो नाम स्टोर करना होगा, और यह आवश्यक है कि उपयोगकर्ता इंटरैक्शन फ़ंक्शन का उपयोग करने से पहले डॉस ऐप के सही पृष्ठ पर वापस आएं।

संपादित करें: कुछ अधिक जानकारी

लेगेसी एप्लिकेशन उपयोगकर्ता को दिखाई जाने की आवश्यकता है, लेकिन एक अलग विंडो में नहीं।

मैंने तीमुथियुस के उत्तर की कोशिश की है और यह बहुत अच्छी तरह से काम करता है, लेकिन क्या यह एक ही कार्यक्षमता प्राप्त करना संभव है, लेकिन डॉस विंडो के साथ खिड़कियों के रूप में या उपयोगकर्ता की नियंत्रण में अपनी खिड़की में पॉप-अप करने के बजाय दृश्यमान रूप से एम्बेड किया गया है? पसंदीदा रूप से ShowDialog() तरीके से ताकि उपयोगकर्ता ऐप वाइल के साथ बातचीत नहीं कर सके, वे 'विरासत मोड' में हैं, इसलिए बोलने के लिए।

उत्तर

22

यह प्रक्रिया वर्ग का उपयोग कर सांत्वना/डॉस आवेदनों की मानक इनपुट/आउटपुट पुनर्निर्देशित करने के लिए संभव है। यह कुछ इस तरह दिख सकता है:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters"); 

processStartInfo.UseShellExecute = false; 
processStartInfo.ErrorDialog = false; 

processStartInfo.RedirectStandardError = true; 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 
processStartInfo.CreateNoWindow = true; 

Process process = new Process(); 
process.StartInfo = processStartInfo; 
bool processStarted = process.Start(); 

StreamWriter inputWriter = process.StandardInput; 
StreamReader outputReader = process.StandardOutput; 
StreamReader errorReader = process.StandardError; 
process.WaitForExit(); 

अब आप आवेदन के साथ बातचीत करने की धाराओं का उपयोग कर सकते हैं। प्रक्रिया को सेट करकेStartInfo.CreateNoWindow को सही करने के लिए मूल एप्लिकेशन छुपाया जाएगा।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

मैं 'outputReader' का उपयोग उस एप्लिकेशन के साथ कैसे कर सकता हूं जो चल रहा है और जब तक उपयोगकर्ता मौजूद न हो तब तक लगातार आउटपुट हो रहा है? कुछ नोडजेस http सर्वर की तरह, जहां प्रत्येक बार अनुरोध किया जाता है, वहां एक नया लाइन आउटपुट होता है? – Ace

1

आप CreateProcess फ़ंक्शन और HStdInput, आउटपुट, और STARTUPINFO तर्क के त्रुटि सदस्यों का उपयोग कर सकते हैं, इससे आपको मानक इनपुट और एप्लिकेशन के आउटपुट को अवरुद्ध करने की अनुमति मिल जाएगी।

4

कैसे Windows ऐप के अंदर डॉस एप्लिकेशन को प्रदर्शित करने पर आपके प्रश्न के संबंध में।

कुछ समाधान हैं।

  • पहले एक बस (CreateNoWindow के साथ) डॉस एप्लिकेशन प्रदर्शित नहीं करने के लिए और पढ़ने और धाराओं को लिख कर "अनुकरण" अपने विंडोज़ अनुप्रयोग में डॉस अनुप्रयोग के UI है।

  • दूसरा समाधान Win32API का उपयोग करना होगा, कंसोल/डॉस एप्लिकेशन विंडो के विंडोज हैंडल (Whnd) प्राप्त करें और अपने माता-पिता को अपने फॉर्म पर सेट करें। मैं वर्तमान में घर पर नहीं हूं और जब से मैंने ऐसा किया है, तब से उम्र बढ़ गई है, मुझे यह याद नहीं है कि यह कैसे किया जाता है।अगर मैं गलत नहीं कर रहा हूँ आप निम्नलिखित Win32 API कॉल का उपयोग करना होगा:

मैं कुछ समय के बाद में आज बचा हुआ है तो , मैं देखूंगा कि मैं बेहतर नमूने पा सकता हूं या नहीं।

+0

धन्यवाद तीमुथियुस, मैंने पहले से ही FindWindow और GetWindow API कॉल का उपयोग किया है, मैं आज SetParent में देखता हूं। आपकी मदद के लिए फिर से धन्यवाद! उम्मीद है कि मैं एक दिन का पक्ष वापस कर पाऊंगा। –

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