Как получить согласие ОАК.exe на передний план программно?


Как (если это вообще возможно) вывести диалог согласия UAC Vista/Win7 на передний план, когда он свернут на панели задач?

Например, рассмотрим следующий сценарий:
Мое приложение проверяет наличие обновлений во время запуска, загружает новый файл обновления и выполняет его, предоставляя пароль администратора в процессе.StartInfo, после этого моя заявка закрывается.

В этот момент, если пользователь или сама Windows удается потерять фокус от Окно установщика MSI (возможно, щелкнув по рабочему столу или другому окну), UAC видит, что окно установщика не является окном переднего плана, и таким образом выводит мигающий диалог согласия на панель задач.

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

Проблема в том, что я не могу принести его на первый план. Я попытался вызвать ShowWindow () из user32.DLL с разных параметров (восстановление, показывают, нормально), но ничего не происходит. Я проверил процесс MainWindowHandle, и он кажется нормальным (он не нулевой или отрицательный). Я предполагаю, что проблема заключается в том, что UAC создает другой сеанс рабочего стола для диалога согласия (secure desktop).

Если пользователь может щелкнуть мигающий значок на панели задач, чтобы вывести диалог согласия на передний план, то он также должен иметь возможность имитировать это с помощью кода?

ПС! Я использую C#

2 4

2 ответа:

Вы пробовали SetForegroundWindow ? Кроме того, в собственном win32 нет ничего, что называется главным окном, процесс может иметь 0 или любое количество "главных окон", но в случае согласия.отлично, я предполагаю, что у него есть только один...

Редактировать:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) 
{
    char buf[50];
    *buf=0;
    GetClassName(hwnd,buf,50);
    buf[sizeof("$$$Secure UAP")-1]=0;
    if (!lstrcmp("$$$Secure UAP",buf)) 
    {
        SwitchToThisWindow(hwnd,true);
    }
    return true;
}
...
EnumWindows(EnumWindowsProc,0);

Это переключит на безопасный рабочий стол, но я бы не рекомендовал использовать это, потому что:

    Он использует недокументированный $ $ $ Secure UAP... класс окна
  • Использование SwitchToThisWindow-это зло, вы никогда не следует переключать фокус, когда пользователь не хочет
  • Если активировано несколько диалоговых окон подтверждения UAC,вы не можете быть уверены, какое именно согласие.exe вы будете переключаться на

Проблема в том, что окно согласия не является собственным всплывающим окном, если бы это было так, вы могли бы быть уверены, что получили правильный HWND. Надеюсь, Win8 будет иметь согласие действовать как собственное всплывающее окно, или даже лучше, модальный диалог.

Здесь есть обсуждение, которое может помочь вам: Как вы максимизируете окно контроля учетных записей пользователей(UAC)?

Официальная документация по этому вопросу находится здесь: редизайн для совместимости с UAC (UAC)