【发布时间】:2011-05-30 08:32:31
【问题描述】:
当 Vista/Win7 UAC 同意对话框在任务栏中最小化时,如何(如果可能)将其置于前台?
例如,考虑以下场景:
我的应用程序在启动期间检查更新,它下载新的更新文件并通过在 Process.StartInfo 中提供管理员密码来执行它,然后我的应用程序关闭。
此时,如果用户或 Windows 本身设法从 MSI 安装程序窗口失去焦点(可能是通过单击桌面或其他窗口),UAC 会发现安装程序窗口不是前台窗口,因此会弹出一个闪烁的同意对话框进入任务栏。
一些不太聪明的客户不了解我的应用程序尚未完成更新并尝试重新启动该应用程序。在这个阶段,我可以枚举正在运行的进程,找到任务栏中闪烁的consent.exe。
问题是我不能把它带到前台。我尝试使用不同的参数(恢复、显示、正常)从 user32.dll 调用 ShowWindow(),但没有任何反应。我确实检查了 MainWindowHandle 进程,它似乎没问题(它不是零或负数)。我猜测问题在于 UAC 为同意对话框(安全桌面)创建了不同的桌面会话。
如果用户可以点击任务栏中闪烁的图标将同意对话框带到前台,那么也应该可以通过代码来模拟这个?
PS!我正在使用 C#
【问题讨论】:
-
这一定是我的 #1 UAC 最讨厌的地方。