Запустите 2-й экземпляр программы aC# с параметром, который использует 1-й экземпляр программы

У меня есть программа с одним экземпляром, и при ее запуске я могу передать ей один параметр.

Если программа работает без параметров, просто откройте на вкладке a dataGridView и загрузите в него список клиентов. Если я дважды щелкну строку, это откроет этого конкретного клиента во 2-й вкладке с дополнительной информацией об этом.

Если я запускаю программу с параметром (идентификатор клиента от 00000 до 99999), она автоматически переключается на вторую вкладку и загружает данные отдельных клиентов.

Однако пока все хорошо, что я хочу иметь возможность запустить мою программу, но если второй экземпляр программы вызывается с параметром, например Program.exe 1234, я хочу, чтобы он просто перешел прямо к 2-я вкладка и отображать данные этого клиента

Это то, что я до сих пор. Я лаю не на том дереве, как я пытаюсь это сделать? У меня складывается впечатление, что Program.exe должен прослушивать другой запущенный экземпляр и использовать переданный ему параметр.

Любой совет будет принята с благодарностью.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
using System.IO;

namespace SiteConnex { public class SingleApplication { /// Imports [DllImport("user32.dll")] private static extern int ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] private static extern int SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern int IsIconic(IntPtr hWnd); public static bool secondInstance = false; public static string siteid = ""; public static bool gotosite = false;

    public static void Main(string[] args)
    {
        // string siteid = "";
        // bool gotosite = false;
        // bool secondInstance = false;
        int testSiteid = 0;
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        try
        {
            siteid = Convert.ToString(args[0]);
        }
        catch (Exception noArgs)
        {
            // No commandline args have been passed.
        }

// проверяем, что переданный параметр является действительным числом, в противном случае просто действуйте так, как не передано никаких параметров try { testSiteid = Convert.ToInt32(siteid); if ((testSiteid > 00000) || (testSiteid < 99999)) { gotosite = true; } else { siteid = ""; } } catch (Exception e) { // Если вы получаете исключение, это означает, что siteid передал данные duff. }

/// Проверьте, работает ли он, если он есть, пропустите siteid и gotosite через... и действует так, как будто ему передали действительный siteid. // Application.Run(новый Form1(siteid, gotosite)); Run(siteid, gotosite, secondInstance); } приватная статическая IntPtr GetCurrentInstanceWindowHandle() { IntPtr hWnd = IntPtr.Zero; Process process = Process.GetCurrentProcess(); Process[] процессы = Process.GetProcessesByName(process.ProcessName); foreach(Process _process в процессах) {// Получить первый экземпляр, который не является этим экземпляром, имеет // то же имя процесса и был запущен с того же имени файла // и местоположения. Также убедитесь, что у процесса есть действительный дескриптор окна // в этом сеансе, чтобы отфильтровать // процессы другого пользователя. if (_process.Id!= process.Id && _process.MainModule.FileName == process.MainModule.FileName && _process.MainWindowHandle!= IntPtr.Zero) { hWnd = _process.MainWindowHandle; перерыв; } } return hWnd; } /// SwitchToCurrentInstance частная статическая пустота SwitchToCurrentInstance(строка siteid, bool gotosite, bool secondInstance) { IntPtr hWnd = GetCurrentInstanceWindowHandle(); if (hWnd!= IntPtr.Zero) { // Восстановить окно, если оно свернуто. Не восстанавливайте, если уже // нормальное или развернутое состояние окна, так как мы не хотим // изменять текущее состояние окна. if (IsIconic(hWnd)!= 0) { ShowWindow(hWnd, SW_RESTORE); } // Установить окно переднего плана. SetForegroundWindow(HWND); secondInstance = true; } } /// Выполнить приложение на основе формы, если другой экземпляр уже запущен на ///, система активирует предыдущий /// основная форма /// true, если предыдущий экземпляр не является running // public static bool Run(System.Windows.Forms.Form frmMain) public static bool Run(строка siteid, bool gotosite, bool secondInstance) { if(IsAlreadyRunning()) { // установить фокус на ранее запущенное приложение SwitchToCurrentInstance(siteid готосит, второй экземпляр); вернуть ложь; } Application.Run(новый Form1(siteid, gotosite, secondInstance)); вернуть истину; } /// проверяем, запущен ли данный exe-файл или нет /// возвращает true, если уже запущен приватный статический bool IsAlreadyRunning() { string strLoc = Assembly.GetExecutingAssembly().Location; FileSystemInfo fileInfo = new FileInfo(strLoc); строка sExeName = fileInfo.Name; bool bCreatedNew; mutex = новый Mutex(true, "Global\\"+sExeName, out bCreatedNew); if (bCreatedNew) mutex.ReleaseMutex(); return!bCreatedNew; } статический мьютекс мьютекс; const int SW_RESTORE = 9; }

}

1 ответ

Решение

Ах, ха... нашел ответ в этом... Кто-то по имени MadHatter сделал приложение SingleInstance, которое делает именно то, что я искал, и кажется довольно прямым.

http://sanity-free.org/misc/SingleInstanceApp.zip

Другие вопросы по тегам