gpt4 book ai didi

c# - 如何以编程方式将 UAC 的 consent.exe 带到前台?

转载 作者:行者123 更新时间:2023-11-30 12:52:26 25 4
gpt4 key购买 nike

当 Vista/Win7 UAC 同意对话框在任务栏中最小化时,如何(如果可能的话)将其置于前台?

例如,考虑以下场景:
我的应用程序在启动期间检查更新,它下载新的更新文件并通过在 Process.StartInfo 中提供管理员密码来执行它,之后我的应用程序关闭。

此时,如果用户或 Windows 本身设法从 MSI 安装程序窗口失去焦点(可能通过单击桌面或其他窗口),UAC 会发现安装程序窗口不是前台窗口,因此会弹出一个闪烁的同意对话框进入任务栏。

一些不太聪明的客户不明白我的应用程序尚未完成更新并尝试重新启动应用程序。在这个阶段,我可以枚举正在运行的进程并找到在任务栏中闪烁的 consent.exe。

问题是我不能把它带到前台。我尝试使用不同的参数(恢复、显示、正常)从 user32.dll 调用 ShowWindow(),但没有任何反应。我确实检查了进程 MainWindowHandle,它似乎没问题(它不是零或负数)。我猜问题在于 UAC 为同意对话框(安全桌面)创建了不同的桌面 session 。

如果用户可以点击任务栏中的闪烁图标将同意对话框带到前台,那么应该也可以通过代码来模拟吗?

附言!我正在使用 C#

最佳答案

你试过了吗SetForegroundWindow ?此外,在 native 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);

这将切换到安全桌面,但我不建议使用它,因为:

  • 它使用未记录的 $$$Secure UAP... 窗口类
  • 使用 SwitchToThisWindow 是邪恶的,你不应该在用户不想的时候切换焦点
  • 如果多个 UAC 确认对话框处于事件状态,您无法确定要切换到哪个 consent.exe

问题是同意窗口不是一个拥有的弹出窗口,如果它是你可以确定你得到了正确的 HWND。希望 Win8 将同意充当自有弹出窗口,或者更好的模式对话框。

关于c# - 如何以编程方式将 UAC 的 consent.exe 带到前台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4525479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com