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 窗口中不起作用的主要内容,如果未能解决你的问题,请参考以下文章