2016-01-30 46 views
-1

我正在使用Microsoft Visual Studio 2010,並且正在使用C/C++編寫我的代碼。使用ShellExecuteEx()使UAC窗口到頂部

我有自動啓動我的安裝過程的代碼。安裝過程需要UAC在這種情況下,所以我用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()函數創建信息窗口,同時也建立了單獨的窗口消息線程。窗口可見,最頂層,它響應消息。我必須創建它,因爲我已閱讀SHELLEXECUTEINFO結構中正確的hwnd參數以保持UAC提示窗口位於頂部。

但這不起作用。有時UAC窗口運行最大化,但主要是在任務欄中最小化和突出顯示。有沒有一種方法可以將UAC窗口置頂?

+2

如果調用'ShellExecuteEx'的程序沒有前臺激活,那麼UAC對話框無法激活,所以必須等到使用激活它爲止。 –

+1

你正在泄漏字符串'_strdup'。 –

+0

@JonathanPotter它是測試,我會刪除它。 – deselect

回答

1

只是將其標記爲已回答

如果調用的ShellExecuteEx程序不具有前景 激活,那麼UAC對話框不能採取激活,所以它必須 等到使用激活它。 Raymond Chen

+0

嗯,這很尷尬! – milevyo