Вывод приложения на передний план (в максимальном размере сверху) из режима минимизации по времени (не за счет взаимодействия с пользователем) автоматически

#c# #uwp

#c# #uwp

Вопрос:

Требуется: автоматическое выведение приложения на передний план (в максимальном размере сверху) из режима минимизации по времени (не за счет взаимодействия с пользователем или подтверждения) независимо от того, запущено какое-либо приложение на переднем плане или нет.

Фактическое поведение: приложение не отображается на переднем плане сверху, просто мигает (оранжевым) на панели задач.

Наше требование: Давайте разберемся с целью, у нас есть проигрыватель, у которого есть одна функция под названием screen saver, похожая на Windows screen saver. Наше приложение запускается и воспроизводится, когда пользователь каким-либо образом взаимодействует с устройством, наше сворачивается, пользователь продолжает работать на устройствах, готово и уходит, затем устройство некоторое время простаивает (без взаимодействия с пользователем), затем наше приложение должно быть выведено на передний план и воспроизводиться и так далее.

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

Однако, если мы запускаем приложение в режиме компактного просмотра по времени, приложение запускается, но все равно оказывается поверх всех приложений, запущенных на переднем плане.

Когда мы запускаем приложение из отладки (с помощью Visual Studio), приложение выходит на передний план по времени или коду идеально, независимо от того, над каким приложением мы работаем..

Но когда мы запускаем приложение из автозагрузки (после установки — без отладки), пользователь взаимодействует с устройством (например, нажимает или перемещает мышь), приложение переходит в режим минимизации в соответствии с логикой и ждет некоторое время, не открывая какое-либо приложение (быть на рабочем столе) при условии, что приложение выходит на передний план, это нормально, но если пользователь откроет какое-либо приложение, пока наше приложение находится в режиме минимизации, тогда оно не выйдет на передний план, просто значок приложения мигает на панели задач.

Мы также пытались запустить приложение на передний план с помощью приложения Desktop extension bridge, но все равно обнаружили то же поведение.

Комментарии:

1. » Я перепробовал много способов вывести приложение на передний план, но ни один из них не сработал » — возможно, вам следует показать, что вы пробовали, чтобы люди не предлагали один и тот же совет

2. Я бы порекомендовал вам прочитать блог Раймонда Чена. Такие вещи, как сворачивание, а затем автоматический возврат к самому верхнему полноэкранному режиму, иногда блокируются Windows, потому что это действие, вызванное пользователем, а не действие, вызванное программой (представьте, что программы одновременно выполняли то же самое).

3. Спасибо @Neil, не могли бы вы указать конкретный блог Raymond Chen, связанный с ним, потому что я просмотрел его, не могу найти ни одного соответствующего блога..

4. Привет @manigupta, запуск приложения должен выполняться пользователем. Приложения UWP в настоящее время не имеют этого разрешения, то есть приложение не может самостоятельно выйти из режима и вернуться на передний план.

Ответ №1:

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

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWindowVisible(IntPtr hWnd);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsIconic(IntPtr hWnd);

public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList lParam);

public static ArrayList GetAllWindows()
{
    ArrayList windowHandles = new ArrayList();
    EnumedWindow callBackPtr = GetWindowHandle;
    EnumWindows(callBackPtr, windowHandles);
    return windowHandles;
}

private static bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles)
{            
    if (IsWindowVisible(windowHandle))
    {
        if (IsIconic(windowHandle))
        {
            ShowWindow(windowHandle, 3); //SW_MAXIMIZE
        }
    }
    return true;
}