在任务栏中最小化时,如何(如果可能)将 Vista/Win7 UAC 同意对话框置于前台?
例如,考虑以下场景:
我的应用程序在启动期间检查更新,它下载新的更新文件并通过在 Process.StartInfo 中提供管理员密码来执行它,然后我的应用程序关闭。
此时,如果用户或 Windows 本身设法从 MSI 安装程序窗口失去焦点(可能是通过单击桌面或其他窗口),UAC 会看到该安装程序窗口不是前台窗口,因此会弹出一个闪烁的同意对话框到任务栏。
一些不太聪明的客户不明白我的应用程序尚未完成更新并尝试重新启动应用程序。在这个阶段,我可以枚举正在运行的进程并找到在任务栏中闪烁的consent.exe。
问题是我不能把它带到前台。我尝试使用不同的参数(恢复、显示、正常)从 user32.dll 调用 ShowWindow(),但没有任何反应。我确实检查了 MainWindowHandle 进程,它看起来没问题(它不是零或负数)。我猜测问题在于 UAC 为同意对话框(安全桌面)创建了不同的桌面会话。
如果用户可以点击任务栏中闪烁的图标将同意对话框带到前台,那么应该也可以通过代码来模拟吗?
附注!我正在使用 C#
您尝试过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);
Run Code Online (Sandbox Code Playgroud)
这将切换到安全桌面,但我不建议使用它,因为:
问题是同意窗口不是一个拥有的弹出窗口,如果是的话,您可以确定您获得了正确的 HWND。希望 Win8 能够同意充当一个拥有的弹出窗口,甚至更好,一个模式对话框。
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |