Запустите 2-й экземпляр программы ac # с параметром, который использует 1-й экземпляр программы - PullRequest
0 голосов
/ 10 февраля 2011

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

Если программа запускается без параметров, она просто открывает на вкладке 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;</p>

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

<pre><code>    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.} </p> /// Проверьте, запущен ли он, если он есть, пропустите 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, если не запущен предыдущий экземпляр // public static bool Run (System.Windows.Forms.Form frmMain) public static bool Run (строка siteid, bool gotosite, bool secondInstance) {if (IsAlreadyRunning ()) {// установить фокус на ранее запущенное приложение SwitchToCurrentInstance (siteid, gotosite, secondInstance); вернуть ложь; } 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 Ответ

0 голосов
/ 10 февраля 2011

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

http://sanity -free.org / разное / SingleInstanceApp.zip

...