2008-09-09 11 views
24

मेरे पास सी # विनफॉर्म एप्लिकेशन है जो समय-समय पर बाहरी एक्सई शुरू करने की आवश्यकता है, लेकिन अगर कोई पहले से चल रहा है, तो मैं दूसरी प्रक्रिया शुरू नहीं करना चाहता हूं, बल्कि इसके लिए स्विच करता हूं।मैं कैसे पता लगा सकता हूं कि सी # का उपयोग कर प्रक्रिया पहले से चल रही है या नहीं?

तो सी # में मैं नीचे दिए गए उदाहरण में ऐसा कैसे करूं?

using System.Diagnostics; 

... 

Process foo = new Process(); 

foo.StartInfo.FileName = @"C:\bar\foo.exe"; 
foo.StartInfo.Arguments = "Username Password"; 

bool isRunning = //TODO: Check to see if process foo.exe is already running 


if (isRunning) 
{ 
    //TODO: Switch to foo.exe process 
} 
else 
{ 
    foo.Start(); 
} 

उत्तर

29

यह इसे के लिए करना चाहिए।

Check Processes

//Namespaces we need to use 
using System.Diagnostics; 

public bool IsProcessOpen(string name) 
{ 
    //here we're going to get a list of all running processes on 
    //the computer 
    foreach (Process clsProcess in Process.GetProcesses()) { 
     //now we're going to see if any of the running processes 
     //match the currently running processes. Be sure to not 
     //add the .exe to the name you provide, i.e: NOTEPAD, 
     //not NOTEPAD.EXE or false is always returned even if 
     //notepad is running. 
     //Remember, if you have the process running more than once, 
     //say IE open 4 times the loop thr way it is now will close all 4, 
     //if you want it to just close the first one it finds 
     //then add a return; after the Kill 
     if (clsProcess.ProcessName.Contains(name)) 
     { 
      //if the process is found to be running then we 
      //return a true 
      return true; 
     } 
    } 
    //otherwise we return a false 
    return false; 
} 

 
+0

क्या इसमें शामिल होने के बजाय समानता का उपयोग करने के लिए सहेजा नहीं जाएगा, आपकी टिप्पणी इस बात को प्रतिबिंबित नहीं करती है कि यह कैसे व्यवहार करेगा।
यदि मैं spesifc नाम "नोटपैड" होने के लिए नोटपैड.एक्सई और किसी भी अन्य प्रोसेस को ढूंढने जा रहा हूं जिसने इसके नाम पर नोटपैड किया है। – EKS

+0

लाइन 'foreach (Process.GetProcesses में प्रक्रिया clsProcess) {' पढ़ना चाहिए 'foreach (Process.GetProcesses() { –

+0

@ जॉन एम - अच्छी आंखों में प्रक्रिया clsProcess! फिक्स्ड – DaveK

4

आप बस Process.GetProcesses पद्धति का उपयोग करके प्रक्रियाओं की गणना कर सकते हैं।

1

मुझे लगता है कि आपकी समस्या का पूरा उत्तर यह समझने की आवश्यकता है कि क्या होता है जब आपका एप्लिकेशन निर्धारित करता है कि foo.exe का एक उदाहरण पहले से चल रहा है i.e '// TODO: foo.exe प्रक्रिया पर स्विच करें' वास्तव में क्या मतलब है?

6

मैंने मौजूदा प्रक्रिया को सक्रिय करने के लिए वीबी रनटाइम में AppActivate फ़ंक्शन का उपयोग किया है। आपको C# प्रोजेक्ट में Microsoft.VisualBasic dll आयात करना होगा।

using System; 
using System.Diagnostics; 
using Microsoft.VisualBasic; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Process[] proc = Process.GetProcessesByName("notepad"); 
      Interaction.AppActivate(proc[0].MainWindowTitle); 
     } 
    } 
} 
21

आप LINQ रूप में अच्छी तरह उपयोग कर सकते हैं,

var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>")); 
1

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

मैं विशिष्ट हार्डवेयर इंटरफेस पर निर्भरताओं के कारण, दूसरे उदाहरण को चलाने से रोकने की कोशिश कर रहा था। उस "स्विच टू" लाइन के साथ आपको जो चाहिए, उसके आधार पर, आपको एक प्रक्रिया आईडी या हैंडल जैसे अधिक विशिष्ट समाधान की आवश्यकता हो सकती है।

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

0

Mnebuerquo लिखा है:

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

मैं इस प्रक्रिया मैं चलाना चाहते हैं स्रोत कोड पहुँच नहीं है।

मैं इस प्रक्रिया में स्विच करने की प्रक्रिया MainWindowHandle का उपयोग कर एक बार मैं ने पाया है समाप्त हो गया है यह alread चल रहा है:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 
1

दो को ध्यान में रखना चिंताओं:

  1. आपका उदाहरण शामिल कमांड लाइन पर पासवर्ड डालें। एक गुप्त का क्लीयरक्स्ट प्रतिनिधित्व एक सुरक्षा भेद्यता हो सकता है।

  2. प्रक्रियाओं की गणना करते समय, खुद से पूछें जो आपको वास्तव में संसाधित करना चाहते हैं। सभी उपयोगकर्ता, या सिर्फ वर्तमान उपयोगकर्ता? क्या होगा अगर वर्तमान उपयोगकर्ता दो बार (दो डेस्कटॉप) में लॉग इन है?

2

मुझे पता चला कि म्यूटेक्स कंसोल एप्लिकेशन की तरह काम नहीं कर रहा है। तो कार्य प्रबंधक विंडो का उपयोग करके देखा जा सकता है कि क्वेरी प्रक्रियाओं के लिए WMI का उपयोग कर अपनी समस्या हल हो जाएगा। प्रकार IntelliSense सक्षम करने के लिए विधानसभा संदर्भ जोड़ें "System.Management":

कुछ इस तरह का प्रयोग करें:

static bool isStillRunning() { 
    string processName = Process.GetCurrentProcess().MainModule.ModuleName; 
    ManagementObjectSearcher mos = new ManagementObjectSearcher(); 
    mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'"; 
    if (mos.Get().Count > 1) 
    { 
     return true; 
    } 
    else 
     return false; 
} 

नोट।

+0

यह दृष्टिकोण कमांड लाइन तर्कों का निरीक्षण करने की अनुमति देता है (mo [ "कमांड लाइन"]); – crokusek

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

  • कोई संबंधित समस्या नहीं^_^