SetWindowDisplayAffinity 在 MFC 窗口中不起作用

Posted

技术标签:

【中文标题】SetWindowDisplayAffinity 在 MFC 窗口中不起作用【英文标题】:SetWindowDisplayAffinity not works in MFC windows 【发布时间】:2020-12-01 13:06:04 【问题描述】:

我有 1 个图片控制,并希望使其不能录屏。 在.Net中,我一直在使用SetWindowDisplayAffinity

WDA_MONTOR = 1;
SetWindowDisplayAffinity(this.Handle, WDA_MONTOR); 

现在我已迁移到 MFC 以获得原生性能。 我正在使用以下代码,它不会阻止 screenshots

HWND Handle = this->GetDlgItem(IDC_SCREEN)->m_hWnd;
SetWindowDisplayAffinity(Handle, WDA_MONITOR);

完整示例:

if(SetWindowDisplayAffinity(hWnd, WDA_MONITOR)==false)

    wchar_t buf[256];
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
    AfxMessageBox(buf);

GetLastError 说“参数不正确”。

【问题讨论】:

我不熟悉 API 但标志不应该是WDA_EXCLUDEFROMCAPTURE 吗?根据文档,返回值为BOOL,如果FALSE,您可以使用GetLastError 进行调查。 WDA_EXCLUDEFROMCAPTURE 在 Windows 10 中引入。GetLastError 表示 parameter is incorrect。见代码rentry.co/agvyh 我用此信息更新了您的问题,因为它有帮助。但是,这超出了我的知识范围,所以也许其他人可以提供帮助。 .NET 版本正在传递窗体的窗口句柄(***窗口),但您的 MFC 版本正在传递控件的窗口句柄(子窗口)。使用***窗口。 您应该选择要保护的***窗口。 【参考方案1】:

根据Raymond chen

.NET 版本传递窗体的窗口句柄(***窗口),但您的 MFC 版本传递控件的窗口句柄(子窗口)。使用***窗口。

这意味着我必须使用 Form 句柄而不是 PictureBox 句柄。 所以改变

HWND Handle = this->GetDlgItem(IDC_SCREEN)->m_hWnd; //PictureBox handle
SetWindowDisplayAffinity(Handle, WDA_MONITOR);

HWND Handle = this->m_hWnd;      //form handle
SetWindowDisplayAffinity(Handle, WDA_MONITOR);

原因:Form窗口是***窗口。

【讨论】:

以上是关于SetWindowDisplayAffinity 在 MFC 窗口中不起作用的主要内容,如果未能解决你的问题,请参考以下文章