Windows应用程序打开其他程序并置顶

应用程序打开其他外部应用程序并保证置顶

注:
1. 此文主要讨论Win10系统,其他系统可能没这么复杂
2. 仅讨论非管理员权限进程,已有管理员权限进程可作为参考

问题描述
非管理员权限的进程,在后台启动一个外部程序,无法保证打开的进程窗口处于激活状态或者得到输入焦点,只会在任务栏有颜色的变化作为通知。

先提一个解决办法:监测打开的进程主窗口,然后置顶,设置焦点。这种方法很多问题,不做讨论。

实际原因:当主进程窗口没有获得输入焦点时,Windows禁止主进程打断其他进程的输入,也就导致需要用户手动切换输入到新打开的窗口。


解决办法:让主进程窗口(没有窗口就创建一个)拿到焦点

  1. 当前激活窗口没有管理员权限时,有两个办法:

    1. 通过AttachThreadInput、SetForegroundWindow等操作,将窗口置顶,并获得焦点;
    2. 进程注册快捷键,进程自己模拟快捷键,响应WM_HOTKEY消息。

    第一个方法比较常见,但当激活窗口是UWP程序时会失败。猜测是UWP和Win32的输入隔离导致;第二个方法是模拟键盘按键,进程响应快捷键消息时会得到输入焦点(猜测)。但也有例外,当置顶窗口是UWP程序时,调用calc.exe打开计算器或通过链接打开Edge可能会无法置顶。

    经过测试,经过如下操作,基本可以保证:

    a. 主进程创建一个不影响用户的小窗口,对该窗口执行方法1
    b. 模拟快捷键按键
    c. 进程收到快捷键消息
    d. 打开应用程序

    注:当置顶窗口是UWP程序时,根据方法1的例外,步骤a是失败的,但貌似还是有作用。 步骤a也不可以延迟到步骤c之后,可能会出现窗口层次混乱。

  2. 当前激活窗口有管理员权限时,无解,除非主进程同样拥有管理员权限,可参照以上步骤解决。

猜你喜欢

转载自blog.csdn.net/eiilpux17/article/details/82189097