Как программно вывести UAC ACX.exe на первый план? - PullRequest
4 голосов
/ 24 декабря 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 29 января 2011

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

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

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 будет иметь согласие действовать как собственное всплывающее окно или, что еще лучше, модальное диалоговое окно.

0 голосов
/ 24 декабря 2010

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

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

...