如果(如果可能的话)将Vista / Win7 UAC同意对话框置于前台,当它在任务栏中最小化时?
例如,请考虑以下情况:
我的应用程序在启动期间检查更新,它下载新的更新文件并通过在Process.StartInfo中提供管理员密码来执行它,之后我的应用程序关闭。
此时,如果用户或Windows本身设法从MSI安装程序窗口失去焦点(可能通过单击桌面或其他窗口),UAC会发现安装程序窗口不是前景窗口,因此会弹出一个闪烁的同意对话框进入任务栏。
一些不那么明亮的客户不明白我的应用程序尚未完成更新并尝试重新启动应用程序。在这个阶段,我可以枚举正在运行的进程,并找到任务栏中闪烁的consent.exe。
问题是我无法把它带到前台。我试图用user32.dll从不同的参数调用ShowWindow()(恢复,显示,正常),但没有任何反应。我确实检查了MainWindowHandle进程,看起来没问题(它不是零或负数)。我猜测问题在于UAC为同意对话框(安全桌面)创建了一个不同的桌面会话。
如果用户可以点击任务栏中的闪烁图标将同意对话框带到前台,那么还应该可以通过代码模拟这个吗?
PS!我正在使用C#
答案 0 :(得分:1)
你试过SetForegroundWindow吗?此外,在本机win32中没有任何称为主窗口,一个进程可以有0或任何数量的“主窗口”,但在consent.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);
这将切换到安全桌面,但我不建议使用它,因为:
问题是同意窗口不是拥有弹出窗口,如果是,你可以确定你得到了正确的HWND。希望Win8将获得同意,作为一个拥有弹出窗口,甚至是更好的模态对话框。
答案 1 :(得分:0)
此处有一个讨论可以帮助您:How do you maximize User Account control(UAC) window?
有关该主题的官方文档如下:Redesign for UAC Compatibility (UAC)