Запустите 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;
}
}
/// Выполнить приложение на основе формы, если другой экземпляр уже запущен на ///, система активирует предыдущий /// основная форма param> /// 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, которое делает именно то, что я искал, и кажется довольно прямым.