使用 ShellExecuteEx() 将 UAC window 置顶
Bring UAC window to top using 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()
函数创建信息 window 并且它还创建单独的 window 消息线程。 Window 是可见的,最上面的并且它响应消息。我必须创建它,因为我读过 SHELLEXECUTEINFO
结构中的正确 hwnd
参数需要保持 UAC 提示符 window 在顶部。
但这不起作用。有时 UAC window 会最大化运行,但主要是它会最小化并在任务栏中突出显示。有没有办法在任何情况下都将 UAC window 置于顶部?
标记为已回答
If the program that called ShellExecuteEx does not have foreground
activation, then the UAC dialog cannot take activation, so it has to
wait until the use activates it. Raymond Chen
我正在使用 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()
函数创建信息 window 并且它还创建单独的 window 消息线程。 Window 是可见的,最上面的并且它响应消息。我必须创建它,因为我读过 SHELLEXECUTEINFO
结构中的正确 hwnd
参数需要保持 UAC 提示符 window 在顶部。
但这不起作用。有时 UAC window 会最大化运行,但主要是它会最小化并在任务栏中突出显示。有没有办法在任何情况下都将 UAC window 置于顶部?
标记为已回答
If the program that called ShellExecuteEx does not have foreground activation, then the UAC dialog cannot take activation, so it has to wait until the use activates it. Raymond Chen