使用ShellExecuteEx()将UAC窗口置于顶部

时间:2016-01-30 01:28:01

标签: c winapi uac shellexecuteex

我正在使用Microsoft Visual Studio 2010,我正在使用C / C ++编写代码。

我有自动启动安装过程的代码。在这种情况下,安装过程需要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()函数创建信息窗口,它还创建单独的窗口消息线程。窗口是可见的,最顶层,它响应消息。我必须创建它,因为我已经读过hwnd结构中需要正确的SHELLEXECUTEINFO参数来保持UAC提示窗口位于顶部。

但这不起作用。有时UAC窗口最大化,但主要是最小化并在任务栏中突出显示。有无法在任何情况下将UAC窗口置于顶端的方法吗?

1 个答案:

答案 0 :(得分:1)

只需将其标记为已收回

  

如果调用ShellExecuteEx的程序没有前台   激活,然后UAC对话框不能激活,所以它必须   等到使用激活它。 Raymond Chen