Я добавляю код в приложение, которое запустит другое приложение, если оно еще не запущено, или если оно есть, принесите его на передний план. Это требует небольшого количества interop/WinAPI-кода, который я получил примеры из других сайтов, но, похоже, не может работать в Win7.
Если окно находится в каком-то видимом состоянии, то метод API SetForegroundWindow работает как лечение (и это будет основной случай, согласно политике компании, если внешнее приложение работает, оно не должно быть минимизировано). Однако, если он сведен к минимуму (исключительный, но важный, поскольку в этом случае мое приложение ничего не сделает), ни этот метод, ни ShowWindow/ShowWindowAsync фактически не вернут окно из панели задач; все методы просто выделяют кнопку на панели задач.
Здесь код; большинство из них работает нормально, но вызов ShowWindow() (я также попробовал ShowWindowAsync) просто никогда не делает то, что я хочу, независимо от того, какую команду я посылаю:
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hWnd);
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_RESTORE = 9;
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
...
//The app is named uniquely enough that it can't be anything else,
//and is not normally launched except by this one.
//so this should normally return zero or one instance
var processes = Process.GetProcessesByName("ExternalApp.exe");
if (processes.Any()) //a copy is already running
{
//I can't currently tell the window state,
//so I both restore and activate it
var handle = processes.First().MainWindowHandle;
ShowWindow(handle, SW_RESTORE); //GRR!!!
SetForegroundWindow(handle);
return true;
}
try
{
//If a copy is not running, start one.
Process.Start(@"C:\Program Files (x86)\ExternalApp\ExternalApp.exe");
return true;
}
catch (Exception)
{
//fallback for 32-bit OSes
Process.Start(@"C:\Program Files\ExternalApp\ExternalApp.exe");
return true;
}
Я пробовал SHOWNORMAL (1), SHOWMAXIMIZED (3), RESTORE (9) и пару других команд, но ничего похожего не делает. Мысли?
РЕДАКТИРОВАТЬ: Я нашел проблему с некоторым другим кодом, который, как я думал, работал. Вызов GetProcessesByName() не нашел процесс, потому что я искал исполняемое имя, которое не было именем процесса. Это привело к тому, что код, который, как я думал, был запущен и вообще не выполнялся вообще. Я думал, что он работает, потому что внешнее приложение, по-видимому, также обнаружит, что копия уже запущена и пытается активировать этот текущий экземпляр. Я удалил ".exe" из имени процесса, которое я ищу, и теперь выполняется код; однако это кажется шагом назад, так как теперь кнопка панели задач даже не подсвечивается, когда я вызываю ShowWindow [Async]. Итак, теперь я знаю, что ни мое приложение, ни внешнее приложение, которое я вызываю, не могут изменить состояние окна другого экземпляра программным способом в Win7. Что здесь происходит?