一、查找问题
收到反馈说编码器被360弹窗拦截器拦截,经测试发现强力模式下也并没有直接拦截,但是会出现提示框;猜测有可能是用户不小心添加过滤了或者其他版本会有拦截,导致编码器被关闭无法正确编码。查找资源后发现,弹窗拦截是通过发送Windows消息触发隐藏和关闭的。
于是考虑先把编码器生成后接受到的消息打印出来查看分析。
由于WPF本身是有对消息和窗口句柄等进行封装的,所以需要重新去添加using System.Windows.Interop; 这个namespace中所包含的东西主要是为 Windows Presentation Foundation (WPF) 和其他技术(如 Win32API)之间的互操作提供支持类型,并为涉及 WPF 的其他特定互操作方案提供基类。在WPF中使用WindowProc,首先要获得一个HWND句柄(一个IntPtr类型),然后通过创建一个HwndSource对象,再通过调用这个对象中的AddHook方法来添加WindowProc。其中HwndSource实现包含 WPF 内容的 Win32 窗口。WPF 内容在此窗口中排列、度量、呈现,并且可交互式输入。HwndSource 类设计用于一般的交互操作,而不是设计用作托管 HWND 包装。通常,它不会提供操作窗口的托管方法或检测其状态的属性。相反,HwndSource类提供通过 Handle 属性对 Win32 窗口句柄 (HWND) 的访问,可通过 PInvoke 技术将其传递到 Win32 APIs 以操作该窗口。
现在开始进行挂钩,可以通过添加SourceInitialized的事件处理函数引发添加,直接重载OnSourceInitialized函数来添加。下面是通过添加处理函数的方式实现。