大过年的一朋友让我帮他实现一个关于阻止他的软件被截图的小功能;最终的效果:
1、直接引用系统自带的:
[DllImport("User32.dll", SetLastError = true)]
private static extern bool SetWindowDisplayAffinity(IntPtr hWnd, uint dwAffinity);
2、必须在Load事件里面:
/// <summary>
/// 这里是截取的是个黑框
/// </summary>
public const int WDA_MONITOR = 0x00000001;
/// <summary>
/// 这里直接是透明的
/// </summary>
public const int WDA_EXCLUDEFROMCAPTURE = 0x00000011;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
IntPtr hWnd = IntPtr.Zero;
//获取 WPF 窗口的句柄
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
if (hwndSource != null)
{
hWnd = hwndSource.Handle;
}
if (hWnd != IntPtr.Zero)
{
bool result = SetWindowDisplayAffinity(hWnd, WDA_EXCLUDEFROMCAPTURE);
if (!result)
{
int errorCode = Marshal.GetLastWin32Error();
Debug.WriteLine("Error: " + errorCode);
}
}
}
3、当AllowsTransparency="True"失效,但还是要透明背景异形窗口,然后找到了大佬给推荐的高性能的无边框方案:
WindowStyle="None" ResizeMode="CanMinimize/NoResize"
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="-1" />
</WindowChrome.WindowChrome>
简单效果就这么完事了;毕竟咱也是第一次玩耍;万一人家拿着手机直接拍界面呢,这时我们应该直接调用摄像头通过图像识别技术再来动态控制软件的呈现;编程不息、Bug不止、无Bug、无生活;改bug的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧;今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法,可以在留言板随意留言;我看到后会第一时间回复大家,多谢大家的一直默默的关注和支持!如果觉得不错,那就伸出您的小手点个赞并关注一下,多谢您的支持!