سؤال

أريد أن أعرف كيف يمكنني التحقق من البرنامج في موقع معين إذا كان يعمل.على سبيل المثال هناك نوعان من المواقع test.exe في c:\loc1 est.exe و c:\loc2 est.exe.أردت فقط أن أعرف إذا كان c:\loc1 est.exe يعمل وليس كل الحالات test.exe.

هل كانت مفيدة؟

المحلول

bool isRunning = Process.GetProcessesByName("test")
                .FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);

نصائح أخرى

وهذا هو بلدي تحسين وظيفة:

private bool ProgramIsRunning(string FullPath)
{
    string FilePath =  Path.GetDirectoryName(FullPath);
    string FileName = Path.GetFileNameWithoutExtension(FullPath).ToLower();
    bool isRunning = false;

    Process[] pList = Process.GetProcessesByName(FileName);

    foreach (Process p in pList) {
        if (p.MainModule.FileName.StartsWith(FilePath, StringComparison.InvariantCultureIgnoreCase))
        {
            isRunning = true;
            break;
        }
    }

    return isRunning;
}

وواستخدامها على النحو التالي:

ProgramIsRunning(@"c:\loc1\test.exe");

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

إذا كان هناك عملية تشغيل مع اسم معين، ثم إذا كان هذه العملية وسيلة للوصول يتعرض أن العائدات حيث تم تحميله من، هل يمكن أن يطلق هذا الأسلوب على عملية تشغيل، وإلا، وأنا لا أعرف ..

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

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    private static extern bool IsIconic(IntPtr hWnd);

    private const int SW_HIDE = 0;
    private const int SW_SHOWNORMAL = 1;
    private const int SW_SHOWMINIMIZED = 2;
    private const int SW_SHOWMAXIMIZED = 3;
    private const int SW_SHOWNOACTIVATE = 4;
    private const int SW_RESTORE = 9;
    private const int SW_SHOWDEFAULT = 10;

 private static bool IsAlreadyRunning()
    {
        // get all processes by Current Process name
        Process[] processes = 
            Process.GetProcessesByName(
                Process.GetCurrentProcess().ProcessName);

        // if there is more than one process...
        if (processes.Length > 1) 
        {
            // if other process id is OUR process ID...
            // then the other process is at index 1
            // otherwise other process is at index 0
            int n = (processes[0].Id == Process.GetCurrentProcess().Id) ? 1 : 0;

            // get the window handle
            IntPtr hWnd = processes[n].MainWindowHandle;

            // if iconic, we need to restore the window
            if (IsIconic(hWnd)) ShowWindowAsync(hWnd, SW_RESTORE);

            // Bring it to the foreground
            SetForegroundWindow(hWnd);
            return true;
        }
        return false;
    }

ويجب أن أعاد على كل العمليات القائمة ومن ثم تحقق الملكية MainModule من أجل اسم الملف الذي تبحث عنه. شيء من هذا القبيل

using System.Diagnostics;
using System.IO;

//...

string fileNameToFilter = Path.GetFullPath("c:\\loc1\\test.exe");

foreach (Process p in Process.GetProcesses())
{
   string fileName = Path.GetFullPath(p.MainModule.FileName);

   //cehck for equality (case insensitive)
   if (string.Compare(fileNameToFilter, fileName, true) == 0)
   {
      //matching...
   }
}

هذه الوظيفة قد تساعد:

using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    foreach (Process clsProcess in Process.GetProcesses()) {
        if (clsProcess.ProcessName.Contains(name))
        {
            return true;
        }
    }
    return false;
} 

المصدر: http://www.dreamincode.net/code/snippet1541.htm

وشيء من هذا القبيل. GetMainModuleFileName يساعد على وصول العملية إلى x64 من إلى x86.

  [DllImport("kernel32.dll")]
  public static extern bool QueryFullProcessImageName(IntPtr hprocess, int dwFlags, StringBuilder lpExeName, out int size);

  private bool CheckRunningProcess(string processName, string path) {

  Process[] processes = Process.GetProcessesByName(processName);
  foreach(Process p in processes) {
    var name = GetMainModuleFileName(p);
    if (name == null)
      continue;
    if (string.Equals(name, path, StringComparison.InvariantCultureIgnoreCase)) {
      return true;
    }
  }
  return false;
}

// Get x64 process module name from x86 process
private static string GetMainModuleFileName(Process process, int buffer = 1024) {

  var fileNameBuilder = new StringBuilder(buffer);
  int bufferLength = fileNameBuilder.Capacity + 1;
  return QueryFullProcessImageName(process.Handle, 0, fileNameBuilder, out bufferLength) ?
      fileNameBuilder.ToString() :
      null;
}

هل يمكن استخدام اسمه مزامنة ، وهذا اسمه الخروج من بنية الدليل تشغيل البرنامج في.

System.Reflection.Assembly.GetEntryAssembly()

وهذا سيجلب لك الكثير من المعلومات حول إدخال التجمع، مثل:

System.Reflection.Assembly.GetEntryAssembly().CodeBase;

وهذا سوف اقول موقع تشغيل التجمع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top