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

核心原理、实现目的

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.hqwc.cn/news/215824.html

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

相关文章

Unity 引擎宣布:自 2024 年起,开发者需支付费用!

Unity引擎宣布的新的收费模式&#xff0c;从2024年1月1日开始&#xff0c;根据游戏的安装量来对开发者进行收费。具体来说&#xff0c;每次游戏被下载时&#xff0c;UnityRuntime也会被安装&#xff0c;因此可能会产生额外的费用。对于开发者来说&#xff0c;需要注意以下几点&…

带submodule的git仓库自动化一键git push、git pull脚本

前言 很久没写博客了&#xff0c;今天难得闲下来写一次。 不知道大家在使用git的时候有没有遇到过这样的问题&#xff1a;发现git submodule特别好用&#xff0c;适合用于满足同时开发和部署的需求&#xff0c;并且结构清晰&#xff0c;方便我们对整个代码层次有一个大概的了…

android 保活的一种有效的方法

android 保活的一种有效的方法 为什么要保活 说起程序的保活,其实很多人都觉得,要在手机上进行保活,确实是想做一些小动作,其实有些正常的场景也是需要我们进行保活的,这样可以增强我们的用户体验。保活就是使得程序常驻内存,这种程序不容易被杀,或者在被杀以后还能完…

html table样式的设计 表格边框修饰

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>今日小说排行榜</title> <style> table {border-collapse: collapse;border: 4px double red; /*…

一文彻底看懂Python切片,Python切片理解与操作

1.什么是切片 切片是Python中一种用于操作序列类型(如列表、字符串和元组)的方法。它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列。切片是访问特定范围内的元素,就是一个Area。 说个笑话:切片不是切片,而是切片,但是又是切片。大家理解下呢(末…

Android相机性能提高50%

文章目录 应用举例&#xff08;可以不看这一part&#xff0c;直接跳过看具体怎么做&#xff09;&#xff1a;Snapchat 通过 Camera2 Extensions API 将新相机功能的集成速度提高了 50%**Camera2 扩展 API 可以访问高级功能更多设备上的更多机会 正文&#xff1a;开始使用扩展架…

vatee万腾的科技征途:Vatee独特探索的数字化力量

在数字化时代的浪潮中&#xff0c;Vatee万腾以其独特的科技征途成为引领者。公司在数字化领域的探索之路不仅是技术的创新&#xff0c;更是一种对未知的勇敢涉足&#xff0c;是对新时代的深刻洞察和积极实践。 Vatee万腾通过独特的探索&#xff0c;展示了在数字化征途上的创新力…

LemMinX-Maven:帮助在eclipse中更方便地编辑maven的pom文件

LemMinX-Maven&#xff1a;https://github.com/eclipse/lemminx-maven LemMinX-Maven可以帮助我们在eclipse中更方便地编辑maven工程的pom.xml文件&#xff0c;例如补全、提示等。不用单独安装&#xff0c;因为在安装maven eclipse插件的时候已经自动安装了&#xff1a; 例…

nginx的n种用法(nginx安装+正向代理+反向代理+透明代理+负载均衡+静态服务器)

nginx的安装 一、安装依赖 # 一键安装四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel二、安装nginx yum install nginx三、检查是否安装成功 nginx -v四、启动/停止nginx /etc/init.d/nginx start /etc/init.d/nginx stop五、编辑配置文件…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

MySQL 有多个普通索引时会取哪一个索引?

我们都知道MySQL在查询时底层会进行索引的优化&#xff0c;假设有两个普通索引&#xff0c;且where 后面也根据这两个普通索引查询数据&#xff0c;那么执行查询语句时会使用到那个索引&#xff1f; 为了方便演示&#xff0c;新建users表&#xff0c;新建idx_name、idx_city这两…

Elasticsearch集群部署

组件介绍 1、Elasticsearch&#xff1a; 是基于一个Lucene的搜索引擎&#xff0c;提供搜索&#xff0c;分析。存储数据三大功能&#xff0c;他提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口&#xff0c;Elasticsearch是用Java开发的&#xff0c;…