SetAdditionalForegroundBoostProcesses 函数 (Winuser.h)

SetAdditionalForegroundBoostProcesses 是一种性能辅助 API,可帮助应用程序使用多进程应用程序模型,其中多个进程作为数据或呈现为前台体验做出贡献。 示例包括浏览器 (,浏览器管理器或框架、选项卡、插件等托管在不同进程中) 和 IDE (生成编译进程和其他任务) 。

应用程序可以使用此 API 为辅助进程提供前台优先级提升,从而帮助支持main应用程序。 当应用程序的顶级窗口位于前台时,此类应用程序可以对其所有构成进程应用统一优先级提升。

语法

BOOL SetAdditionalForegroundBoostProcesses(
  HWND   topLevelWindow,
  DWORD  processHandleCount,
  HANDLE *processHandleArray
);

参数

topLevelWindow

顶级窗口的句柄 (应用程序的 HWND) 。

processHandleCount

processHandleArray 中的进程句柄数。 此函数一次最多可以调用 32 个句柄。 将此参数设置为 0 ,同时将 processHandleArray 设置为 NULL 以清除先前的提升配置。

processHandleArray

要提升前台或取消提升的一组进程句柄。 将此参数设置为 NULL ,同时将 processHandleCount 设置为 0 以清除先前的提升配置。

返回值

如果调用成功提升应用程序,则返回 TRUE ;否则返回 FALSESetAdditionalForegroundBoostProcesses 设置最后一个错误代码,因此,如果调用失败,应用程序可以调用 GetLastError () 以获取扩展信息 (例如ERROR_INVALID_PARAMETER、ERROR_NOT_ENOUGH_MEMORY或ERROR_ACCESS_DENIED) 。

注解

此函数采用一组进程句柄,当传入的顶级 HWND 分别移动到前台或后台时,所有进程句柄都会得到前台提升或取消提升。 每当传入的顶级 HWND 成为前台窗口时,前台提升也将应用于句柄数组中传递的进程。 当顶级 HWND 移动到后台时,会发生类似的解除提升。

传递给此函数的顶级 HWND 必须由调用进程拥有。 调用进程应该对 processHandleArray 中的进程句柄具有PROCESS_SET_INFORMATION访问权限 - 换句话说,你必须完全控制进程中的每个窗口。 如果某个外部组件注入了采用前景的窗口,或者如果出现对话框,则会失去提升。

如果有两个顶级窗口,则需要为每个窗口调用此函数。

如果在调用 SetAdditionalForegroundBoostProcesses 时,传入的顶级 HWND 已在前台,则 processHandleArray 中的所有进程都会立即提升。

仅当顶级 HWND 成为前台窗口时,其句柄位于 processHandleArray 中的进程才会获得前台提升。

仅当出现时,才应用其他前台提升:

  1. 前台窗口更改,或者
  2. 如果在窗口位于前台且新列表具有进程句柄时调用此函数,或者该列表在以前包含时不包含进程句柄。

当拥有顶级 HWND 的进程退出或终止时,额外的提升关系将中断,辅助进程不会收到任何其他前台提升。

主进程的顶级 HWND 将继续保留对辅助进程的引用,直到主进程的顶级 HWND 清除其分组提升状态,或销毁 HWND。

示例

在此简单方案中,应用程序在创建顶级窗口时设置其前台进程提升配置。 处理WM_CREATE时,使用 lParam 中的句柄和 wParam 中的句柄计数调用函数。 当 m_AppWindow 移入和移出前台窗口时,这些进程将提升前台或后台优先级。 如果在调用函数时 m_AppWindow 为前台窗口,则进程还将立即获得前台优先级提升。

case WM_CREATE:   

    // 
    // Configure the passed in worker processes (handles) in lParam, to get foreground priority boost when m_AppWindow moves in and 
    // out of the foreground. 
    //  

    HANDLE *pMyHandles = retinterpret_cast<HANDLE*>(lParam); 
    DWORD cHandles = reinterpret_cast<DWORD>(wParam);  

    If (!SetAdditionalForegroundBoostProcesses(m_AppWindow, cHandles, pMyHandles)) 
    { 
        printf(“SetAdditionalForegroundBoostProcesses() setup failed with error code : %d\n”, GetLastError()); 
    } 

    break;

要求

要求
最低受支持的客户端 Windows 11内部版本 22621
标头 Winuser.h(包括 Windows.h)
Library User32.lib
DLL User32.dll

另请参阅

SetForegroundWindow