كيف يمكنني معرفة ما إذا كانت العملية قيد التشغيل بالفعل باستخدام c#؟

StackOverflow https://stackoverflow.com/questions/51148

  •  09-06-2019
  •  | 
  •  

سؤال

لدي تطبيق C# winforms الذي يحتاج إلى تشغيل ملف exe خارجي من وقت لآخر، ولكنني لا أرغب في بدء عملية أخرى إذا كانت العملية قيد التشغيل بالفعل، بل أرغب في التبديل إليها.

فكيف في C# يمكنني القيام بذلك في المثال أدناه؟

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(); 
}
هل كانت مفيدة؟

المحلول

هذا يجب أن يفعل ذلك من أجلك.

التحقق من العمليات

//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;
}


نصائح أخرى

يمكنك استخدام LINQ أيضًا،

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

لقد استخدمت وظيفة AppActivate في وقت تشغيل VB لتنشيط عملية موجودة.سيكون عليك استيراد Microsoft.VisualBasic dll إلى مشروع C#.

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);
        }
    }
}

يمكنك ببساطة تعداد العمليات باستخدام عملية.احصل على العمليات طريقة.

اكتشفت أن Mutex لا يعمل كما هو الحال في تطبيق وحدة التحكم.لذا فإن استخدام WMI للاستعلام عن العمليات التي يمكن رؤيتها باستخدام نافذة إدارة المهام سوف يحل مشكلتك.

استخدم شيئًا مثل هذا:

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;
}

ملحوظة:أضف مرجع التجميع "System.Management" لتمكين نوع التحسس.

أعتقد أن الإجابة الكاملة لمشكلتك تتطلب فهم ما يحدث عندما يحدد التطبيق الخاص بك أن مثيل foo.exe قيد التشغيل بالفعل، أي ما الذي يفعله '//TODO:التبديل إلى عملية foo.exe يعني في الواقع؟

في مشروع سابق، كنت بحاجة إلى منع التنفيذ المتعدد لعملية ما، لذلك أضفت بعض التعليمات البرمجية في قسم init من تلك العملية مما يؤدي إلى إنشاء كائن مزامنة مسمى.تم إنشاء هذا النص المتبادل والحصول عليه قبل متابعة بقية العملية.إذا كانت العملية قادرة على إنشاء كائن المزامنة (mutex) والحصول عليه، فهي أول عملية قيد التشغيل.إذا كانت هناك عملية أخرى تتحكم بالفعل في كائن المزامنة (mutex)، فإن العملية التي تفشل ليست الأولى، لذا يتم الخروج منها على الفور.

كنت أحاول فقط منع تشغيل مثيل ثانٍ، بسبب التبعيات على واجهات أجهزة معينة.اعتمادًا على ما تحتاجه مع سطر "التبديل إلى"، قد تحتاج إلى حل أكثر تحديدًا مثل معرف العملية أو المقبض.

كما كان لدي إمكانية الوصول إلى التعليمات البرمجية المصدرية للعملية التي كنت أحاول البدء بها.إذا لم تتمكن من تعديل الكود، فمن الواضح أن إضافة كائن المزامنة ليس خيارًا.

هناك مسألتان يجب أخذهما في الاعتبار:

  1. تضمن مثالك وضع كلمة مرور على سطر الأوامر.يمكن أن يكون تمثيل النص الواضح لسر الثغرة الأمنية.

  2. عند تعداد العمليات ، اسأل نفسك عن العمليات التي تريد تعدادها حقًا.جميع المستخدمين ، أو فقط المستخدم الحالي؟ماذا لو تم تسجيل الدخول إلى المستخدم الحالي مرتين (اثنين من أجهزة الكمبيوتر المكتبية)؟

كتب منيبويركو:

أيضا ، كان لدي وصول رمز المصدر إلى العملية التي كنت أحاول البدء بها.إذا لم تتمكن من تعديل الكود ، فمن الواضح أن إضافة Mutex ليس خيارًا.

ليس لدي إمكانية الوصول إلى التعليمات البرمجية المصدر للعملية التي أريد تشغيلها.

لقد انتهى بي الأمر باستخدام عملية MainWindowHandle للتبديل إلى العملية بمجرد أن وجدت أنها قيد التشغيل بالفعل:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool SetForegroundWindow(IntPtr hWnd);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top