防止应用程序截屏(容器式,防止极域电子教室和录屏软件录制)

核心原理、实现目的

1、使用Panel容器将外部窗口嵌入自己写的程序

2、使用防止截屏的函数来对窗口透明,这可以使本窗口内所有窗口在录屏软件上消失

3、解放,抓取,存储句柄,实现摆脱录屏(极域监控)

程序设计

本人始终坚持使用vb.net来编程,不是C#难学,而是vb.net更有性价比……C#源码可以自行翻译C#与vb.net互相转换

中间那一坨是Panel容器,也可以替换成别的控件

如何选取窗口?

看到座上的一个按钮,显示的是一个“+”

按住它不放并且移动到窗口上即可,注意的是,最好要移动到窗口的标题栏或者是边框上才算是该窗体的最终窗体,本人编程能力有限,目前功能不是很完善

此时松开鼠标,就可以看到label处是对应的窗口的名字,listbox内是历史窗口的句柄信息和窗口标题。

如何将目标窗口拖入容器?

点击放入容器,即可将选定窗口或当前选定窗口“嵌入” panel

点击移出容器即可将选定窗口或当前选定窗口“挤出” panel

如何防止截屏?

按下防止截屏即可,此时按钮为红色,容器内窗口为无法录制(截屏),这样性能会变差,可以在必要时恢复录制

代码

API解读

全部封装到模块

    ''' <summary>''' 屏幕坐标->窗口句柄,实现鼠标移动到哪就得到什么窗口的句柄''' </summary>''' <param name="xPoint"></param>''' <param name="yPoint"></param>''' <returns></returns><DllImport("user32.dll", EntryPoint:="WindowFromPoint")>Public Function WindowFromPoint(xPoint As Integer, yPoint As Integer) As IntPtrEnd Function''' <summary>''' 防止截屏的核心,设置窗口是否可录制''' </summary>''' <param name="hWnd"></param>''' <param name="dwAffinity">常量</param>''' <returns></returns><DllImport("user32.dll")>Public Function SetWindowDisplayAffinity(hWnd As IntPtr, dwAffinity As Integer) As BooleanEnd Function''' <summary>''' 获取窗口标题,注意需要一个外部变量存储标题名称,是ByRef / out''' </summary>''' <param name="hWnd"></param>''' <param name="lpString"></param>''' <param name="nMaxCount">接收的最大值</param>''' <returns></returns><DllImport("user32.dll", EntryPoint:="GetWindowText")>Public Function GetWindowText(hWnd As IntPtr, lpString As StringBuilder, nMaxCount As Integer) As IntegerEnd Function''' <summary>''' 设置窗口的父容器''' </summary>''' <param name="hWndChild"></param>''' <param name="hWndNewParent">此处写IntPtr.Zero则移除容器</param>''' <returns></returns><DllImport("user32.dll ", EntryPoint:="SetParent")>Public Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtrEnd Function''' <summary>''' 改变窗口形态''' </summary>''' <param name="hwnd"></param>''' <param name="nCmdShow">常量</param>''' <returns></returns><DllImport("user32.dll", EntryPoint:="ShowWindow", CharSet:=CharSet.Auto)>Public Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As IntegerEnd Function''' <summary>''' 查找标题窗口''' </summary>''' <param name="lpClassName">可为空</param>''' <param name="lpWindowName"></param>''' <returns></returns><DllImport("user32.dll")>Public Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtrEnd Function

 常量声明

SetWindowDisplayAffinity

 ShowWindow

主要代码

请自行分离代码

初始化

Dim ispick As Boolean
Public Const WDA_NONE = &H0
Public Const WDA_EXCLUDEFROMCAPTURE = &H11
Dim s As New StringBuilder
Dim hwnd As IntPtr
Dim childHwnd As IntPtr'没用Dim dirHwnd As New List(Of HwndName)Dim jiyuPath As StringPublic KeyHandle As Integer'没用
Structure HwndNameDim hwnd As IntPtrDim text As StringSub New(hwnd As IntPtr, text As String)Me.hwnd = hwndMe.text = textEnd Sub
End Structure

截屏组

'''防止截屏
SetWindowDisplayAffinity(Me.Handle, WDA_EXCLUDEFROMCAPTURE)
Button2.BackColor = Color.Red
Button3.BackColor = Color.Blue
'''恢复截屏
SetWindowDisplayAffinity(Handle, WDA_NONE)
Button2.BackColor = Color.Blue
Button3.BackColor = Color.Red

容器组

'''放入容器 这里if可以排除其他控件,防止手欠把自己的控件也嵌入panel
If Label1.Text <> "+" ThenSetParent(hwnd, Panel1.Handle)
End If
'''移出容器
SetParent(hwnd, IntPtr.Zero)
'''更新(最大化窗口)
SetParent(hwnd, Panel1.Handle)
ShowWindow(hwnd, 3)

选取窗口

'''按下
Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDownispick = TrueEnd Sub
'''移动
Private Sub Button1_MouseMove(sender As Object, e As MouseEventArgs) Handles Button1.MouseMoveIf ispick = True Thenhwnd = WindowFromPoint(MousePosition.X, MousePosition.Y)GetWindowText(hwnd, s, 255)Label1.Text = s.ToStringEnd If
End Sub
'''松开
Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUpispick = FalsedirHwnd.Add(New HwndName(hwnd, s.ToString))ListHwnd.Items.Clear()For Each item In dirHwndListHwnd.Items.Add("标题:" & item.text & " 句柄:" & item.hwnd.ToString)Next
End Sub

其余代码

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.ResizePanel1.Width = Width - Panel1.Location.X - 25Panel1.Height = Height - 75
End SubPrivate Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChangedIf CheckBox1.Checked = False ThenMe.TopMost = FalseElseTopMost = TrueEnd If
End SubPrivate Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.TickIf TopMost = True ThenTopMost = TrueEnd If
End Sub
'可以不写
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.ClickForm2.Show()Dim hwndhwnd = FindWindow(vbNullString, "屏幕广播")SetParent(hwnd, Form2.Panel2.Handle)ShowWindow(hwnd, 3)'SetWindowDisplayAffinity(Form2.Handle, WDA_EXCLUDEFROMCAPTURE)
End SubPrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadFor Each p In Process.GetProcessesIf p.ProcessName = "StudentMain" ThenjiyuPath = p.MainModule.FileNameEnd IfNextIf jiyuPath = "" ThenMsgBox("极域未运行,请在极域运行后点击启动极域即可完成操作")End IfCheckBox1.Checked = True
End SubPrivate Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.ClickIO.File.WriteAllBytes("C:/助手.exe", My.Resources.v1_2_助手_64位)Process.Start("C:/助手.exe")
End SubPrivate Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.ClickIO.File.WriteAllText("C:/RootCA.reg", My.Resources.RootCA)Process.Start("regedit", "/s C:/RootCA.reg")
End SubPrivate Sub ListHwnd_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListHwnd.SelectedValueChangedIf ListHwnd.SelectedIndex <> -1 Thenhwnd = dirHwnd(ListHwnd.SelectedIndex).hwndLabel1.Text = dirHwnd(ListHwnd.SelectedIndex).textEnd If
End SubPrivate Sub Button10_Click_1(sender As Object, e As EventArgs) Handles Button10.ClickIf jiyuPath = "" ThenFor Each p In Process.GetProcessesIf p.ProcessName = "StudentMain" ThenjiyuPath = p.MainModule.FileNameEnd IfNextIf jiyuPath = "" ThenMsgBox("极域未运行,请在极域运行后点击启动极域即可完成操作")End IfElseProcess.Start(jiyuPath)End If
End SubPrivate Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.ClickProcess.Start("cmd", "/c taskkill /f /im studentmain.exe")
End Sub

源程序和源代码应该会在开头有,感谢博主小流汗黄豆提供的应用程序和设计思路小流汗黄豆 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Addon 增强 Node.js 和 Electron 应用的原生能力

前言 Node.js Addon 是 Node.js 中为 JavaScript 环境提供 C/C 交互能力的机制。其形态十分类似 Java 的 JNI&#xff0c;都是通过提供一套 C/C SDK&#xff0c;用于在 C/C 中创建函数方法、进行数据转换&#xff0c;以便 JavaScript / Java 等语言进行调用。这样编写的代码通常…

Spring - Mybatis-设计模式总结

Mybatis-设计模式总结 1、Builder模式 2、工厂模式 3、单例模式 4、代理模式 5、组合模式 6、模板方法模式 7、适配器模式 8、装饰者模式 9、迭代器模式 虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;…

【数据结构】时间和空间复杂度

马上就要进入到数据结构的学习了 &#xff0c;我们先来了解一下时间和空间复杂度&#xff0c;这也可以判断我们的算法是否好坏&#xff1b; 如何衡量一个算法的好坏&#xff1f; 就是看它的算法效率 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第…

CVE-2023-22515:Atlassian Confluence权限提升漏洞复现 [附POC]

文章目录 Atlassian Confluence权限提升(CVE-2023-22515)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 Atlassian Confluence权限提升(CVE-2023-22515)漏洞复现 [附POC] 0x01 前言 免责声明&…

vue中下载文件后无法打开的坑

今天在项目开发的时候临时要添加个导出功能我就写了一份请求加导出得代码&#xff0c; 代码&#xff1a; //导出按钮放开exportDutySummarizing (dataRangeInfo) {const params {departmentName: dataRangeInfo.name,departmentQode: dataRangeInfo.qode}//拼接所需得urlcons…

第一百七十八回 介绍一个三方包组件:SlideSwitch

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何创建垂直方向的Switch"相关的内容&#xff0c;本章回中将 介绍SlideSwitch组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

多功能智能灯杆主要功能有哪些?

多功能智能灯杆这个词相信大家都不陌生&#xff0c;最近几年多功能智能灯杆行业发展迅速&#xff0c;迅速取代了传统路灯&#xff0c;那么多功能智能灯杆相比传统照明路灯好在哪里呢&#xff0c;为什么大家都选择使用叁仟智慧多功能智能灯杆呢&#xff1f;所谓多功能智能灯杆着…

【libGDX】Mesh纹理贴图

1 前言 纹理贴图的本质是将图片的纹理坐标与模型的顶点坐标建立一一映射关系。纹理坐标的 x、y 轴正方向分别朝右和朝下&#xff0c;如下。 2 纹理贴图 本节将使用 Mesh、ShaderProgram、Shader 实现纹理贴图&#xff0c;OpenGL ES 的实现见博客 → 纹理贴图。 DesktopLauncher…

超级应用平台(HAP)起航

各位明道云用户和伙伴&#xff0c; 今天&#xff0c;我们正式发布明道云10.0版本。从这个版本开始&#xff0c;我们将产品名称正式命名为超级应用平台&#xff08;Hyper Application Platform, 简称HAP&#xff09;。我们用“超级”二字表达产品在综合能力方面的突破&#xff…

视频监控中的智能算法与计算机视觉技术

智能视频监控是一种基于人工智能技术的监控系统&#xff0c;它能够通过对图像和视频数据进行分析&#xff0c;自动识别目标物体、判断其行为以及进行异常检测等功能&#xff0c;从而实现对场景的智能化监管。以下是常见的一些用于智能视频监控的算法&#xff1a; 1、人脸识别技…

org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder

密码&#xff0c;加密&#xff0c;解密 spring-security-crypto-5.7.3.jar /** Copyright 2002-2011 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with t…

Kafka(一)

一&#xff1a;简介 解决高吞吐量项目的需求 是一款为大数据而生的消息中间件&#xff0c;具有百亿级tps的吞吐量&#xff0c;在数据采集、传输、存储的过程中发挥着作用 二&#xff1a;为什么要使用消息队列 一个普通访问量的接口和一个大并发的接口&#xff0c;它们背后的…

PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能

​本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器&#xff0c;支持4K HDMI2.0显示&#xff0c;接口丰富&#xff0c;拥有千兆以太网&#xff0c;全协议TypeC接口&#xff0c;USB3.0 &#xff0c;eDP 和…

Redis高并发缓存架构

前言&#xff1a; 针对缓存我们并不陌生&#xff0c;而今天所讲的是使用redis作为缓存工具进行缓存数据。redis缓存是将数据保存在内存中的&#xff0c;而内存的珍贵性是不可否认的。所以在缓存之前&#xff0c;我们需要明确缓存的对象&#xff0c;是否有必要缓存&#xff0c;怎…

2022年03月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 以下四个选项中,运行哪个积木块,可能得到523这个数值? A: B: C: D: 答案:B 四个选项都遵循统一的公式:随机数ⅹ10+3=523,因此可以得出随

和数集团出席中科院上海高研院​第三十三期“高研交叉论坛”信息能源融合专场

2023年11月21日&#xff0c;中国科学院上海高等研究院第三十三期“高研交叉论坛”信息能源融合专场在上海高研院成功举办。本次论坛由中国科学院上海高等研究院智能信息通信技术研究与发展中心、中国科学院低碳转化科学与工程重点实验室、中科院和数智能区块链与能源系统应用联…

【文末送书】机器学习高级实践

2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以OpenAI研发的GPT为代表的大模型大行其道&#xff0c;NLP领域的ChatGPT模型火爆一时&#xff0c;引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升&#xff0c;它能够同时接受图像和文本的输入…

仿 美图 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 效果图一&#xff1a;左右RecyclerView 联动 效果图二&#xff1a;通过点击 向上偏移至最大值 效果图三&#xff1a;通过点击 或 拖动 展开收缩公告 效果图四&…

SpringBoot3核心原理

SpringBoot3核心原理 事件和监听器 生命周期监听 场景&#xff1a;监听应用的生命周期 可以通过下面步骤自定义SpringApplicationRunListener来监听事件。 ①、编写SpringApplicationRunListener实现类 ②、在META-INF/spring.factories中配置org.springframework.boot.Sprin…