Я добавляю некоторый код в приложение, которое запустит другое приложение, если оно еще не запущено, или, если оно есть, перенесло его на передний план. Это требует небольшого количества кода взаимодействия / 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's 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. Что здесь происходит?