Восстановить свернутое окно другого приложения

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

Если окно находится в некотором видимом состоянии, то метод SetForegroundWindow API работает как лакомство (и это будет основным случаем, согласно политике компании, если внешнее приложение запущено, его не следует сворачивать). Однако, если он свернут (исключительный, но важный, поскольку мое приложение в этом случае будет казаться ничего не делающим), ни этот метод, ни 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. Что здесь происходит?

18
задан KeithS 1 February 2012 в 17:25
поделиться