SetWindowDisplayAffinity是否作用于ComboBox下拉列表?技术求助
问题:SetWindowDisplayAffinity无法屏蔽ComboBox下拉列表的屏幕捕获
我正在沙箱应用中测试功能,准备提交到主项目。其中一项功能是使用SetWindowDisplayAffinity使程序UI避免被屏幕捕获工具抓取,该功能在Windows自带截图、OBS Studio等工具中对主窗体生效,但ComboBox的下拉列表却不受影响。
我尝试了Monitor Display Affinity选项和较新的ExcludeFromCapture模式,均无效果,不确定是打开ComboBox列表时创建的控件(或UI)拥有独立句柄未被影响,还是SetWindowDisplayAffinity本身忽略ComboBox。
我附上两张截图以说明情况:红色文本和红色框是用户可见内容,黄色文本和黄色框是屏幕捕获工具可见内容,浅蓝色文本表示Display Affinity状态。
- 截图1:SetWindowDisplayAffinity已禁用,屏幕捕获软件可看到所有UI组件。
- 截图2:SetWindowDisplayAffinity已启用配置,所有UI组件应仅对用户可见、无法被捕获,但ComboBox列表无视该设置。
DLL导入代码(无Win32错误)
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] public static extern uint SetWindowDisplayAffinity(IntPtr Handle, DisplayAffinity Affinity); public enum DisplayAffinity : uint { None = 0x0, Monitor = 0x1, ExcludeFromCapture = 0x11 }
API调用方式
第一种是常规调用方式,后两种是尝试的临时解决方案:
常规调用
void HideFromCapture() { // <Handle>为窗体主句柄,此处为<MainForm.Handle>。 SetWindowDisplayAffinity(Handle, DisplayAffinity.ExcludeFromCapture); // 在所有UI组件加载完成后调用<HideFromCapture()>。 }
尝试对ComboBox单独调用
void HideFromCaptureFixOne() { // 尝试同时对窗体和ComboBox调用该API。 SetWindowDisplayAffinity(Handle, DisplayAffinity.ExcludeFromCapture); SetWindowDisplayAffinity(MyComboBox.Handle, DisplayAffinity.ExcludeFromCapture); // 如预期,无效果。 }
尝试遍历所有控件调用
void HideFromCaptureOrLoseAllHope() { // 尝试遍历所有控件调用该API。 foreach(Control Target in Controls) { try { // 我确定这不是正确的使用方式。 SetWindowDisplayAffinity(Target.Handle, DisplayAffinity.ExcludeFromCapture); } catch { continue; } } /* * 再次说明,我在程序运行时调用这些函数,对窗体有效但对ComboBox无效。 * 我甚至尝试循环调用该函数,但也无效,还导致内存占用增加。 */ }
目前我陷入困境,希望能得到解决该问题的技术帮助。
内容的提问来源于stack exchange,提问作者user23223164
相关产品推荐
相关产品推荐

