加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:13:39 所属栏目:百科 来源:网络整理
导读:如何(如果可能的话)将Vista / Win7 UAC同意对话框置于前台,当它在任务栏中最小化时? 例如,请考虑以下情形: 我的应用程序在启动期间检查更新,它下载新的更新文件并通过在Process.StartInfo中提供管理员密码来执行它,之后我的应用程序关闭. 此时,如果用户或W
如何(如果可能的话)将Vista / Win7 UAC同意对话框置于前台,当它在任务栏中最小化时?

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

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

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

问题是我无法把它带到前台.我试图用user32.dll从不同的参数调用ShowWindow()(恢复,显示,正常),但没有任何反应.我确实检查了MainWindowHandle进程,看起来没问题(它不是零或负数).我猜测问题出在UAC为同意对话框(安全桌面)创建不同的桌面会话.

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

PS!我正在使用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);

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

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

问题是同意窗口不是拥有的弹出窗口,如果是,你可以确定你得到了正确的HWND.希望Win8将获得同意,作为一个拥有弹出窗口,甚至更好的模式对话框.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读