C++ - 不同窗口的 SetWindowDisplayAffinity 返回 False

问题描述 投票:0回答:1

嗨,我有一个 C++ 代码,尝试将不同窗口的

SetWindowDisplayAffinity()
更改为
WDA_NONE
。然而这个函数返回 False 表明它设置失败。

目标窗口是 NodeJS Electron 应用程序,具有

win.setContentProtection(true);

这是C++代码:

#include <iostream>
#include <windows.h>

using namespace std;
int main()
{
    HWND hwnd = FindWindow(NULL, L"electronapp");

    if (hwnd != NULL) {
        DWORD_PTR affinity = WDA_NONE;
        BOOL result = SetWindowDisplayAffinity(hwnd, affinity);

        if (result) {
            std::cout << "Window display affinity set to WDA_NONE successfully." << std::endl;
        }
        else {
            DWORD error = GetLastError();

            std::cerr << "Failed to set window display affinity. Error code: " << error << std::endl;
        }
    }
    else {
        std::cerr << "Window not found." << std::endl;
    }

    cin.ignore();

    return 0;
}

GetLastError()
函数返回错误代码
5
。但是,我尝试了以下选项:

  • 禁用UAC
  • 以管理员身份运行

我这段代码做错了什么吗?还是别的什么?

c++ winapi
1个回答
1
投票

Windows 错误代码

5
是:

// Access is denied.
#define ERROR_ACCESS_DENIED              5L

您得到它的原因是

SetWindowDisplayAffinity
要求:

该窗口必须属于当前进程。

在您的情况下,该窗口属于不同的进程,因此您不能在其上使用

SetWindowDisplayAffinity

至于api这么指定的原因:
请参阅文档中的此注释:

该函数和 GetWindowDisplayAffinity 旨在支持新的窗口内容保护功能 Windows 7。此功能使应用程序能够保护自己的 屏幕窗口内容 被捕获或通过复制 一组特定的公共操作系统功能和 API。

(重点是我的)

并且允许您从进程外部覆盖此设置将使其毫无意义。

© www.soinside.com 2019 - 2024. All rights reserved.