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

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

此时,如果用户或Windows本身设法从MSI安装程序窗口中失去焦点(也许通过单击桌面或其他窗口),则UAC会看到安装程序窗口不是前台窗口,因此将闪烁的同意对话框弹出到窗口中。任务栏。

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

问题是我无法将其带到前台。我尝试使用不同的参数(还原,显示,正常)从user32.dll调用ShowWindow(),但没有任何 react 。我确实检查了MainWindowHandle进程,看起来还可以(不是零或负数)。我猜想问题出在UAC为同意对话框创建另一个桌面 session (安全桌面)。

如果用户可以单击任务栏中的闪烁图标以将同意对话框置于前台,那么是否还可以通过代码来模拟该对话框?

PS!我正在使用C#

最佳答案

您尝试过SetForegroundWindow吗?另外,在 native win32中,实际上没有任何东西叫做主窗口,一个进程可以有0个或任意数量的“主窗口”,但是在accept.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确认对话框处于事件状态,则不能确定将切换到

  • 问题是同意窗口不是自带的弹出窗口,如果可以的话,则可以确保您获得了正确的HWND。希望Win8能够同意充当自己的弹出窗口,甚至更好地充当模式对话框。

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

    10-14 16:35