Убедитесь, что один экземпляр приложения WPF: трудности с восстановлением уже запущенного приложения на переднем плане - PullRequest
0 голосов
/ 28 марта 2012

Намерение : запустить отдельный экземпляр приложения WPF.Когда запускается новый экземпляр, уже запущенный экземпляр должен быть установлен на передний план.

Хотя у меня достигнута большая часть , я сталкиваюсь с проблемой, когда сидит уже запущенное приложениев трее уведомлений.Код выполняется без ошибок, но не может восстановить окно и установить его на передний план. Фрагмент кода (c #):

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);

var currentProcess = Process.GetCurrentProcess();

string processName = currentProcess.ProcessName;
Process[] instances = Process.GetProcessesByName(processName);

if (instances.Length > 1)
{
    foreach(var instance in instances)
    {
        if (!currentProcess.Id.Equals(instance.Id))
        {
            IntPtr hWnd = instance.MainWindowHandle;

            if (IsIconic(hWnd))
                ShowWindow(hWnd, SW_RESTORE);

            SetForegroundWindow(hWnd);
        }
    }
    currentProcess.Kill();
}

Может ли кто-нибудь указать, что я делаю неправильно.Повторим еще раз, это работает в случае, когда уже запущенное окно находится в развернутом состоянии, но задним числом.Сбой, когда уже запущенное окно сворачивается в панель уведомлений.

Спасибо

1 Ответ

0 голосов
/ 28 марта 2012

Проверено ли, что ваш код выполняет ShowWindow, когда уже запущенный процесс находится в системном окне? Я спрашиваю, потому что я не думаю, что IsIconic является правильной функцией для использования: документация утверждает, что она "определяет, свернуто ли указанное окно". Если процесс находится в systray, он не свернут, он скрыт.

Я думаю, вы должны использовать IsWindowVisible вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...