【问题标题】:SetWindowDisplayAffinity not works in MFC windowsSetWindowDisplayAffinity 在 MFC 窗口中不起作用
【发布时间】: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 版本正在传递控件的窗口句柄(子窗口)。使用顶级窗口。
  • 您应该选择要保护的顶级窗口。

标签: c++ windows mfc screenshot


【解决方案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窗口是顶级窗口。

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2020-10-16
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多