2010-03-06 17 views
8

में मैंने प्रोग्राम के बारे में कुछ विषय पढ़े हैं जो विंडोज फॉर्म और कंसोल अनुप्रयोगों को जोड़ते हैं, लेकिन ऐसा लगता है कि मेरा प्रश्न अभी तक हल नहीं हुआ है। क्या सीएमडी-लाइन से प्रोग्राम चलाने और फॉर्म के माध्यम से और cmd-line कमांड के माध्यम से एप्लिकेशन को नियंत्रित करने में सक्षम होना संभव है? इसका मतलब यह है:कंसोल से विंडोज फॉर्म + कमांड सी #

    के माध्यम से आवेदन (Windows फार्म) रूपों को नियंत्रित करने के आवेदन की साधारण उपयोगकर्ताओं के लिए
  • ,
  • डिबगिंग और उन्नत उपयोगकर्ताओं (कंसोल के माध्यम से आवेदन को नियंत्रित करने और वैकल्पिक रूप से देखते हैं कि क्या Windows Forms में हो रहा है के लिए
  • ))

मुझे पता है कि मैं जो चाहता हूं वह काफी बड़ा सौदा है, और इसका शायद यह बहुत काम होगा, लेकिन फिर भी मैं जानना चाहता हूं कि इसे ठीक से कैसे किया जाए।

+0

आप एक ही ऐप्लिकेशन, कि एक रूपों यूआई और यह भी एक सांत्वना है कि कर सकते हैं मांग पर "ऊपर पॉप" जा प्रस्तुत envisioning रहे हैं? या आप एक फॉर्म ऐप की कल्पना कर रहे हैं जिसे कुछ प्रोग्राम-सुलभ इंटरफ़ेस के माध्यम से मनमाने ढंग से अन्य ऐप्स से नियंत्रित किया जा सकता है? – Cheeso

+0

पहला विकल्प –

उत्तर

5

यह मुश्किल नहीं है, बस अपने स्वयं के कंसोल बनाने के लिए AllocConsole() API फ़ंक्शन को P/Invoke करें। उदाहरण के लिए, अपने Program.cs स्रोत कोड फ़ाइल इस तरह दिखना बनाते हैं:

static class Program { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
#if DEBUG 
     CreateConsole(); 
#endif 
     Application.Run(new Form1()); 
    } 

    static void CreateConsole() { 
     var t = new System.Threading.Thread(() => { 
     AllocConsole(); 
     for (; ;) { 
      var cmd = Console.ReadLine(); 
      if (cmd.ToLower() == "quit") break; 
      // Etc... 
     } 
     FreeConsole(); 
     }); 
     t.IsBackground = true; 
     t.Start(); 
    } 
    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AllocConsole(); 
    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool FreeConsole(); 
    } 
+0

मुझे समझ में नहीं आता कि कैसे डेवलपर प्रबंधित कोड में काम करते समय देशी एपीआई पर इतनी तेजी से वापस चलाता है ... पहले ढांचे की खोज करें, वास्तव में मूल एपीआई एक्सेस के लिए केवल कुछ ही ज़रूरतें हैं ... –

+0

@ बायोफॉल्फ: कृपया हमें दिखाएं कि कैसे आप मांग पर एक कंसोल विंडो बनाते हैं। –

+0

आपको क्यों चाहिए?बस अपने Winforms-App स्टार्टअप को दोबारा दें, और मुख्य रूप से चल रहे एप्लिकेशन के लिए कमांडलाइन पैरामीटर को मुख्य रूप से पाइप करने की बजाय - तरीके पर्याप्त से अधिक हैं, सभी प्रबंधित संभव हैं। –

0

मुझे याद है कि IronPython को पाइथन के कमांड लाइन इंटरफेस (IDLE) से विंडोज फॉर्म को नियंत्रित करने वाले डेमो में उपयोग किया जा रहा है।

संपादित करें: मुझे मूल वीडियो नहीं मिला लेकिन यह दिखाएगा कि बहुत अधिक प्रयास किए बिना क्या संभव है। See this video और 1 9:00 तक कूदें।

+0

यह दिलचस्प है, धन्यवाद! लेकिन मैं ऐसे समाधान की तलाश में हूं जो किसी भी नए उपकरण का उपयोग न करे। –

+0

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

0

यह संभव होगा। आपको उसी प्रक्रिया के भीतर एक अलग application domain के उपयोग के साथ संभवतः विंडोज फॉर्म फॉर्म को थ्रेड करना होगा। आप प्रॉक्सी ऑब्जेक्ट (मार्शलबीरफॉबजेक्ट को विरासत में प्राप्त करने वाले संदेश वर्ग का एक प्रकार) बनाने में लग सकते हैं।

1

आपको केवल एक फॉर्म के बजाय ApplicationContext के साथ अपने विंडोज फॉर्म एप्लिकेशन को शुरू करने की आवश्यकता है। तब आप दिखाए जाने वाले मुख्य रूप के आधार पर नहीं हैं और कंसोल एप्लिकेशन की तरह कार्य कर सकते हैं।

आप, साथ ही एक कमांड लाइन निष्पादन और Windows प्रपत्र के साथ लिंक बना सकते हैं उन्हें इस्तेमाल करने के अपने आप को पुस्तकालय।

एक और तरीका है स्टार्टर किसी तरह का उपयोग करने के लिए, जो Windows फॉर्म्स आवेदन ऊपर आग, और एक कमांड लाइन टूल है जो Windows के साथ संचार स्थानीय नेटवर्किंग, या कुछ अन्य अंतर संचार प्रक्रिया, D-Bus या समान से अधिक आवेदन फॉर्म्स होगा सिस्टम - many ways lead to Rome ...

0

आम तौर पर आपके आवेदन को देखते समय, आपके पास एक यूआई परत और एक व्यापार परत (और एक डेटा परत, और जो कई और परतों को जानता है) है। आप कंसोल क्लाइंट को यूआई लेयर (सरल कमांड इनपुट के साथ) और विंडोज फॉर्म क्लाइंट के रूप में दूसरे के रूप में सोच सकते हैं।

बस कमांड लाइन तर्क के लिए एप्लिकेशन स्टार्टअप पर जांचें। वहाँ निर्दिष्ट तर्क कर रहे हैं, सरल सांत्वना कक्षाओं का दृष्टांत, अन्यथा (शायद अधिक जटिल) का दृष्टांत विंडोज फॉर्म्स कक्षाएं। सेटअप (जबकि यह सांत्वना आवेदन से नियंत्रित) आप डेटा बाइंडिंग के साथ कर सकते हैं के रूप में ज्यादा के रूप में अपने आवेदन पत्र

आप अपने परिवर्तन Windows में प्रतिबिंबित करने के लिए चाहते हैं, तो आवेदन फॉर्म्स। अपने व्यापार की परत को प्रतिबिंबित करने दें कि वास्तव में आपके आवेदन में क्या चल रहा है।

1

हाँ, आप क्या चाहते हैं बहुत संभव है। आपके पास विकल्प हैं कुछ मैं के बारे में सोच सकते हैं ...:

  1. उपयोग यूआई स्वचालन एक नियंत्रक एप्लिकेशन है जो Windows से जुड़ सकते हैं लिखने के लिए आवेदन फॉर्म और इसे नियंत्रित। यह विंडोज   Vista में नया है।System.Windows.Automation नेमस्पेस में प्रबंधित कक्षाएं प्रबंधित की जाती हैं, जिन्हें पहले WPF में भेज दिया गया था, जो .NET 3.0 में पहुंचा था। (अब जब मैं इसके बारे में सोचता हूं, मुझे यकीन नहीं है कि "विंडोज   Vista में नया" सच है। यह ".NET 3.0 में नया" हो सकता है जिसका अर्थ है कि यह विंडोज   XP पर भी काम करता है। हमम ....) यूआई ऑटोमेशन के लिए विंडोज फॉर्म एप्लिकेशन में कोई कोड परिवर्तन की आवश्यकता नहीं है, लेकिन यह निम्न स्तर की तरह हो सकती है, क्योंकि आपको प्रत्येक माउस क्लिक या कट/पेस्ट प्रोग्राम करने की आवश्यकता होती है। the answer to Stack Overflow question Is there a way to control a third-party EXE file from VB.NET? देखें।

  2. WM_COPYDATA इंटरफ़ेस के माध्यम से अपने फ़ंक्शन का पर्दाफाश करने के लिए अपने विंडोज़ फॉर्म एप्लिकेशन को संशोधित करें। फिर आपका ग्राहक आवेदन इसके साथ संवाद कर सकता है। दोबारा, यहां मॉडल दो अलग-अलग अनुप्रयोग हैं, जिनमें से एक दूसरे को नियंत्रित या पूछताछ कर सकता है। .NET Reflector tool इस दृष्टिकोण का एक अच्छा उदाहरण है। the ReflectorAddins project on CodePlex के हिस्से के रूप में उपलब्ध एक परावर्तक नियंत्रक है। नियंत्रक एक कमांड लाइन उपकरण है, जो प्रतिबिंबित करने के लिए WM_COPYDATA संदेश भेज सकता है, इसे एक नई असेंबली खोलने के लिए कह सकता है, किसी विशेष वर्ग पर नेविगेट कर सकता है, और इसी तरह।

    नियंत्रक के लिए कोड: http://reflectoraddins.codeplex.com/sourcecontrol/network/Show?projectName=reflectoraddins&changeSetId=29526#19979

    यह दृष्टिकोण किसी भी विंडोज के लिए काम करेंगे आवेदन फॉर्म्स। आपको WndProc विधि को ओवरराइड करने की आवश्यकता होगी। यह देखने के लिए, The Code Project आलेख Use WM_COPYDATA to send data to/from C++ and C# Windows processes देखें।

    मैंने विंडोज फॉर्म-आधारित प्रगति मॉनिटर बनाने के लिए इस दृष्टिकोण का भी उपयोग किया जो लंबे समय से चलने वाले परीक्षणों की प्रगति को दृष्टि से प्रदर्शित कर सकता है।

  3. अपने आवेदन के भीतर, एक COM सर्वर ऑब्जेक्ट का खुलासा करें जिसे प्रोग्राम किया जा सकता है। यह बिल्कुल ठीक है कि माइक्रोसॉफ्ट ने ऑफिस फ़ंक्शन को एप्लिकेशन में कैसे दिखाया। ऑफिस ऑटोमेशन किसी भी COM-सक्षम प्रोग्राम (सी #, VBScript, PowerShell, पर्ल, PHP, इत्यादि) को Office अनुप्रयोगों को "ड्राइव" करने की अनुमति देता है। यह तब हो रहा है जब Office अनुप्रयोग दिखाई दे रहा है। इस दृष्टिकोण को आपके विंडोज़ फॉर्म एप्लिकेशन में अतिरिक्त कोड की भी आवश्यकता होगी; विशेष रूप से आपको एक COM ऑब्जेक्ट होस्ट करना होगा और इसे अपनी यूआई परत पर लगा देना होगा। यदि आप सुपरसर्स के लिए अधिकतम लचीलापन चाहते हैं तो यह बेहतर हो सकता है - वे उस घटक को चलाने के लिए अपनी स्क्रिप्ट लिख सकते हैं।

मुझे यकीन है कि अन्य विकल्प भी हैं।

+0

+1 और परावर्तक ऐड-इन नमूना लिंक प्रदान करना। –

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