2016-01-30 7 views
-1

Я использую Microsoft Visual Studio 2010, и я пишу свой код в C/C++.Привести окно UAC сверху с помощью ShellExecuteEx()

У меня есть код, который автоматически запускает мой процесс установки. Процесс установки требует контроля учетных записей в этом случае, поэтому я использую ShellExecuteEx() функцию API с runas глаголом:

hWindow = InstallCreateWindow(NULL); 

execInfo.cbSize   = sizeof(execInfo); 
execInfo.lpVerb   = _strdup("runas"); 
execInfo.hwnd   = hWindow; 
execInfo.lpFile   = szPath; 
execInfo.lpParameters = szParams; 
execInfo.fMask   = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; 

Sleep(1000); 

SetActiveWindow(hWindow); 

if(ShellExecuteEx(&execInfo)) 
    return execInfo.hProcess; 

if(GetLastError() == ERROR_CANCELLED) 
{ 
    // user answered NO to UAC prompt 
} 

InstallCreateWindow() функция создает информационное окно, и это также создает отдельное окно цепочки сообщений. Окно видимое, самое верхнее и оно реагирует на сообщения. Я должен создать его, потому что я прочитал, что правильный параметр hwnd в структуре SHELLEXECUTEINFO необходим, чтобы сохранить окно подсказки UAC сверху.

Но это не работает. Иногда окно UAC работает максимально, но в основном оно минимизируется и выделяется на панели задач. Есть ли способ привести окно UAC в начало в любом случае?

+2

Если программа, которая называется «ShellExecuteEx», не имеет активизации переднего плана, тогда диалог UAC не может активировать, поэтому он должен ждать, пока это не активирует его использование. –

+1

Вы просачиваете строку, которую вы '_strdup'. –

+0

@JonathanPotter это для теста, я его удалю. – deselect

ответ

1

JUST МАРКИРОВАТЬ IT AS ОТВЕТИЛ

Если программа, которая называется ShellExecuteEx не имеет передний план активации, то диалог UAC не может принять активацию, поэтому он должен подождать, пока использование не активирует его , Raymond Chen

+0

hmmm, это смущает !!! – milevyo