2010-07-24 9 views
5

के माध्यम से खोले गए एप्लिकेशन को बंद करने से रोकें। मेरे पास एक पुराना कमांड लाइन आधारित प्रोग्राम है (यदि यह महत्वपूर्ण है तो इसका फोर्ट्रान) जिसे उपयोगकर्ता द्वारा बटन पर क्लिक करने पर सी # एप्लिकेशन से खोला जाता है। यदि डेटा चल रहा है, तो कमांड लाइन प्रोग्राम बंद हो जाता है। क्या यह चल रहा है, जबकि लोगों को इसे बंद करने से रोकने के लिए कोई रास्ता है? जैसे [x] उपलब्ध नहीं है या किसी भी तरह प्रोग्राम को मेरे अंदर एम्बेड करें?किसी उपयोगकर्ता को सी # प्रोग्राम

System.Diagnostics.Process pname = 
System.Diagnostics.Process.Start(Path.Combine(Application.StartUpPath, 
"diag_main.exe")); 

    pname.Exited += new EventHandler(pname_Exited); 

नोट: मैं अभी भी आवेदन चल रहा है देखने के लिए सक्षम होना चाहते हैं और जब यह समाप्त हो गया है यह अपने आप ही बंद कर देता है, मैं सिर्फ लोगों को यह की मौत हो गई, जबकि यह चल रहा है की प्रक्रिया में है नहीं हो सकता।

+0

आप इसे कैसे शुरू कर रहे हैं? क्या आप कोड पोस्ट कर सकते हैं? – Oded

उत्तर

2

एक समाधान है कि प्रोग्रामिंग की एक सभ्य राशि ले जाएगा, लेकिन किया जा सकता है:

एक अलग कार्यक्रम है कि कार्यक्रम के स्क्रीन उत्पादन को बीच में रोक नहीं है और अपने कार्यक्रम के लिए यह किसी भी तरह भेजता लिखें। छिपी हुई खिड़की में इस कार्यक्रम को चलाएं, यह चारों ओर घूमता है और ऐप चलाता है और आपके प्रोग्राम में आउटपुट भेजता है।

इंटरसेप्टर के कम से कम हिस्सों को लगभग निश्चित रूप से असेंबली में होना होगा।

संपादित करें: प्रोग्राम केवल तभी लिखता है जब प्रोग्राम केवल इसे लिखता है - वह आउटपुट प्रदर्शित करना चाहता है।

इंट 21h फाइल सिस्टम लिखते हैं:

वहाँ तीन चीजें हैं जो पकड़ा जा की जरूरत हो सकती है। ये वे चीजें हैं जिन्हें stdout को पुनर्निर्देशित करके अवरुद्ध किया जा सकता है।सावधान रहें कि कुछ प्रोग्राम एक अलग हैंडल नंबर पर लिख सकते हैं जो वास्तव में stdout फ़ाइल का प्रतिनिधित्व करता है - प्रोग्राम की हैंडल तालिका में लिखे गए हैंडल को देखें और इसे स्टडआउट एंट्री (आईआईआरसी दूसरी प्रविष्टि) से तुलना करें - यदि वे मेल खाते हैं यह वास्तव में स्क्रीन आउटपुट है।

दूसरा स्तर आईआईआरसी int 10h है। कई उप-कॉल हैं जिन्हें अवरुद्ध किया जाना चाहिए।

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

सभी तीन मामलों में नियमित रूप से दिनचर्या के कुछ हिस्सों को असेंबली में लिखा जाना होगा।

मैंने पहले किया है, दूसरे के साथ थोड़ा सा खेला लेकिन फिर मुझे पता चला कि मैं इसे बिना कर सकता हूं। मैंने कभी तीसरे का प्रयास नहीं किया है।

+1

वह प्रक्रिया से STDOUT को रीडायरेक्ट क्यों नहीं कर सकता? – tster

+0

+1 मुझे लगता है कि यह सबसे अच्छा तरीका है। मुझे वास्तव में नहीं लगता कि इसे बहुत अधिक काम की आवश्यकता होगी, मुझे यकीन है कि सिस्टम। डायग्नोस्टिक्स.प्रोसेस क्लास में मानक इनपुट और आउटपुट दोनों को रीडायरेक्ट करने के लिए गुण हैं। उसके बाद वह अपने ऐप को किसी भी प्रकार के डब्ल्यूपीएफ या विनफॉर्म ऐप में एम्बेड कर सकता है और फिर सुनिश्चित कर सकता है कि उपयोगकर्ता मेजबान ऐप को मार नहीं सकता है। – Pandincus

+0

+1 .NET में रीडायरेक्टिंग stdio मुश्किल नहीं है। यह उन कार्यक्रमों के लिए काम नहीं करता है जो सीधे कंसोल को लिखते हैं, लेकिन वे दुर्लभ हैं। –

1

दुर्भाग्य से, नहीं। यदि अन्य प्रोग्राम में यूआई है, तो आप इसे उपयोगकर्ता से छिपा नहीं सकते हैं। यदि ऐसा नहीं होता है, तो आप इसे ProcessStartInfo कक्षा का उपयोग करके कंसोल विंडो पेश किए बिना लॉन्च कर सकते हैं। भले ही आप ऐसा करते हैं, फिर भी, वे अभी भी कार्य प्रबंधक का उपयोग करके इसे मार सकते हैं।

0

यदि प्रोग्राम cmd विंडो में लोड हो रहा है, तो नहीं, उपयोगकर्ता को विंडो को बंद करने से रोकने का कोई तरीका नहीं है। पृष्ठभूमि में कार्यक्रम लॉन्च करने का एक बेहतर तरीका होगा, जहां यह आकस्मिक उपयोगकर्ताओं से छिपा हुआ है। एक दुर्भावनापूर्ण उपयोगकर्ता अभी भी प्रक्रिया ढूंढ सकता है और इसे मार सकता है, लेकिन यह एक समस्या से कम होने की संभावना है।

आप निम्न के साथ ऐसा कर सकते हैं:

var psi = new ProcessStartInfo(); 
psi.CreateNoWindow = true; 
/// etc. 
1

अगर यह अपने अनुप्रयोग के लिए लागू होगी मैं नहीं जानता, लेकिन आप एक छिपे हुए खिड़की के साथ इस प्रक्रिया को शुरू कर सकते हैं - इसका मतलब यह होगा कि आवेदन है छिपा हुआ और यूआई के माध्यम से नहीं रोका जा सकता है।

अपनी प्रक्रिया ऑब्जेक्ट का निर्माण करते समय, एक कन्स्ट्रक्टर ओवरलोड का उपयोग करें जो ProcessStartInfo ऑब्जेक्ट लेता है। true को ProcessWindowStyle.Hidden को यह की WindowStyle संपत्ति और CreateNoWindow संपत्ति सेट करें:

ProcessStartInfo startInfo = new ProcessStartInfo("fortranApp.exe"); 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.CreateNoWindow = true; 

Process.Start(startInfo); 
बेशक

, यह अभी भी प्रक्रिया सूची में दिखाई देगा और इस तरह से मारा जा सकता है, लेकिन कम से कम यह किसी भी अनजाने में बंद कर पाएगा।

+0

मैं आवेदन देखने में सक्षम होना चाहता हूं हालांकि – Pieces

+0

@ टुकड़े - आप इसे हमेशा कम से कम शुरू कर सकते हैं। अन्यथा, अब मैं प्रक्रिया शुरू करने और विंडो नियंत्रण बटन को अक्षम करने का कोई तरीका नहीं हूं, अगर एप्लिकेशन स्वयं इसका समर्थन नहीं करता है। – Oded

+0

क्या छिपी हुई प्रक्रिया शुरू करना संभव है, फोर्ट्रान प्रोग्राम द्वारा उत्पन्न संदेशों को इकट्ठा करने के लिए stdout से कुछ संलग्न करें और अपने सी # प्रोग्राम पर डिस्प्ले विंडो पर पाइप करें? –

0

आप ProcessStartInfo का उपयोग करने का प्रयास कर सकते हैं और CreateNoWindow पर संपत्ति को सत्य पर सेट कर सकते हैं और WindowStyle to ProcessWindowStyle.Hidden सेट कर सकते हैं। मैंने इसे खुद की कोशिश नहीं की है लेकिन शायद आप भाग्यशाली हैं।