Проверьте, работает ли определенный EXE-файл

Просто бесстыдный разъем к хвосту на ответ, но у меня есть бесплатное веб-приложение, названное Ножовка используемый для просмотра log4net файлы. Я вставил автоматическое обновление опции, таким образом, можно дать себе обновления псевдореального времени, не имея необходимость обновлять браузер все время.

35
задан dsolimano 30 April 2014 в 19:52
поделиться

6 ответов

Я могу порекомендовать следующий подход:

  • Поместите события, которые должны изменить таблицу, в очередь «ожидающих событий», и когда событие помещается в очередь и очередь пусто , затем вызовите поток диспетчеризации событий, чтобы очистить очередь от всех событий и обновить модель таблицы. Эта оптимизация означает , что вы больше не вызываете поток отправки событий для каждого полученного события , что решает проблему, когда поток отправки событий не успевает за основным потоком событий.
  • Избегайте создания нового Runnable при вызове потока диспетчеризации событий с использованием внутреннего класса без сохранения состояния для очистки очереди ожидающих событий в реализации панели таблицы.
  • Дополнительная дополнительная оптимизация:
54
ответ дан 27 November 2019 в 06:55
поделиться

Вы должны перебрать все существующие процессы, а затем проверить их свойство 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...
   }
}
4
ответ дан 27 November 2019 в 06:55
поделиться

Эта функция может помочь:

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

3
ответ дан 27 November 2019 в 06:55
поделиться

Вы можете использовать с именем mutex , имя которого вне структуры каталогов, в которой выполняется программа.

0
ответ дан 27 November 2019 в 06:55
поделиться
System.Reflection.Assembly.GetEntryAssembly()

Это принесет вам много информации о сборке записи, например как:

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

Это укажет расположение работающей сборки.

-1
ответ дан 27 November 2019 в 06:55
поделиться

попробуйте это ... Я использую его, чтобы определить при запуске, запущен ли уже другой процесс с тем же именем, что и исполняемый файл, который я пытаюсь запустить, а затем просто вывести его на передний план , (и чтобы сфокусироваться), если он уже запущен ... Вы можете изменить его, чтобы получить имя процесса и проверить это конкретное имя ... Это скажет вам, запущен ли процесс с определенным именем, но не где этот процесс был загружен из ...

Если есть процесс, запущенный с указанным именем, тогда, если у этого процесса есть открытый доступный метод, который возвращает то место, откуда он был загружен, вы можете вызвать этот метод в запущенном процессе, в противном случае , Я не знаю ..

Но просто из любопытства, почему тебя это волнует, если они не другие? И если они чем-то отличаются, код для использования этой разницы (какой бы она ни была) для определения того, что загружено. Но если они такие же, как это может иметь значение, какой образ на диске был использован для его загрузки?

    [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;
    }
5
ответ дан 27 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: