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

核心原理、实现目的

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 IntPtr

    End 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 Boolean
    End 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 Integer

    End 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 IntPtr

    End 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 Integer

    End 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 IntPtr

    End 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 String

Public KeyHandle As Integer'没用
Structure HwndName
    Dim hwnd As IntPtr
    Dim text As String
    Sub New(hwnd As IntPtr, text As String)
        Me.hwnd = hwnd
        Me.text = text
    End 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 <> "+" Then
    SetParent(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.MouseDown
    ispick = True

End Sub
'''移动
Private Sub Button1_MouseMove(sender As Object, e As MouseEventArgs) Handles Button1.MouseMove
    If ispick = True Then
        hwnd = WindowFromPoint(MousePosition.X, MousePosition.Y)
        GetWindowText(hwnd, s, 255)
        Label1.Text = s.ToString
    End If
End Sub
'''松开
Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
    ispick = False

    dirHwnd.Add(New HwndName(hwnd, s.ToString))
    ListHwnd.Items.Clear()
    For Each item In dirHwnd
        ListHwnd.Items.Add("标题:" & item.text & " 句柄:" & item.hwnd.ToString)
    Next
End Sub

其余代码

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    Panel1.Width = Width - Panel1.Location.X - 25
    Panel1.Height = Height - 75
End Sub

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    If CheckBox1.Checked = False Then
        Me.TopMost = False
    Else
        TopMost = True
    End If
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    If TopMost = True Then
        TopMost = True
    End If
End Sub
'可以不写
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    Form2.Show()
    Dim hwnd

    hwnd = FindWindow(vbNullString, "屏幕广播")
    SetParent(hwnd, Form2.Panel2.Handle)
    ShowWindow(hwnd, 3)
    'SetWindowDisplayAffinity(Form2.Handle, WDA_EXCLUDEFROMCAPTURE)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each p In Process.GetProcesses
        If p.ProcessName = "StudentMain" Then
            jiyuPath = p.MainModule.FileName

        End If
    Next
    If jiyuPath = "" Then
        MsgBox("极域未运行,请在极域运行后点击启动极域即可完成操作")
    End If
    CheckBox1.Checked = True
End Sub


Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    IO.File.WriteAllBytes("C:/助手.exe", My.Resources.v1_2_助手_64位)
    Process.Start("C:/助手.exe")
End Sub

Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    IO.File.WriteAllText("C:/RootCA.reg", My.Resources.RootCA)
    Process.Start("regedit", "/s C:/RootCA.reg")
End Sub


Private Sub ListHwnd_SelectedValueChanged(sender As Object, e As EventArgs) Handles ListHwnd.SelectedValueChanged
    If ListHwnd.SelectedIndex <> -1 Then
        hwnd = dirHwnd(ListHwnd.SelectedIndex).hwnd
        Label1.Text = dirHwnd(ListHwnd.SelectedIndex).text
    End If
End Sub

Private Sub Button10_Click_1(sender As Object, e As EventArgs) Handles Button10.Click
    If jiyuPath = "" Then
        For Each p In Process.GetProcesses
            If p.ProcessName = "StudentMain" Then
                jiyuPath = p.MainModule.FileName
            End If
        Next
        If jiyuPath = "" Then
            MsgBox("极域未运行,请在极域运行后点击启动极域即可完成操作")
        End If
    Else
        Process.Start(jiyuPath)
    End If
End Sub

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    Process.Start("cmd", "/c taskkill /f /im studentmain.exe")
End Sub

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Error querying database. Cause: java.lang.reflect.InaccessibleObjectException:

最近开发过程中&#xff0c;居然碰到了一个Arrays.asList的错&#xff0c;怎么个场景呢&#xff1f;传参一个用固定符号拼接的字符串&#xff0c;需要转成集合然后再myBatis里in判断。然后就报错了。 一、代码层面 service层面&#xff1a; shortDetailUrlList Arrays.asLi…

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

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

汽车电子 -- 根据DBC解析CAN报文

采集的CAN报文&#xff0c;怎么通过DBC解析呢&#xff1f;有一下几种方法。 首先需要确认是CAN2.0 还是CAN FD报文。 还有是 实时解析 和 采集数据 进行解析。 一、CAN2.0报文实时解析&#xff1a; 1、CANTest工具 使用CAN分析仪 CANalyst-II&#xff0c;采集CAN报文。 使用…

免费获取GPT-4的五种工具

不可否认&#xff0c;由OpenAI带来的GPT-4已是全球最受欢迎的、功能最强大的大语言模型&#xff08;LLM&#xff09;之一。大多数人都需要使用ChatGPT Plus的订阅服务去访问GPT-4。为此&#xff0c;他们通常需要每月支付20美元。那么问题来了&#xff0c;如果您不想每月有这笔支…

导入PIL时报错

在导入PIL时,报以下错误: 查找原因 参考博客 Could not find a version that satisfies the requirement PIL (from versions: ) No matching distributi-CSDN博客,按照wheel后,安装PIL时,报如下的错误。 查找说是python版本与wheel文件版本不同,确认本机python版本 …

Git仓库瘦身大作战:133M 到 4M 的实战

开局两张图 瘦身前瘦身后 目录 开局两张图前言下载 BFG克隆代码Git 仓库瘦身清理存储库储存库 GC推送仓库 Git 瘦身验证结语开源项目 前言 在进行项目开发的过程中&#xff0c;代码仓库的体积可能会逐渐增大&#xff0c;特别是在版本控制系统中保留了大量的历史提交记录和不必…

【经典小练习】修改文件中的数据

文章目录 &#x1f339;例子&#x1f33a;思路&#x1f6f8;方法一✨报错解决 &#x1f6f8;方法二 &#x1f339;例子 文本文件中有下面的数据 2-1-9-4-7-8 将文件中的数据进行排序&#xff0c;变成下面的数据 1-2-4-7-8-9 &#x1f33a;思路 要对这些数据进行排序&#xf…

堆的实现(堆的插入、堆的删除等)超级全

堆的实现&#xff08;堆的插入、堆的删除等&#xff09;超级全 文章目录 堆的实现&#xff08;堆的插入、堆的删除等&#xff09;超级全一、前期基础知识1.树结构①树的定义②树的相关概念③二叉树④满二叉树和完全二叉树a.满二叉树b.完全二叉树 ⑤二叉树的性质⑥二叉树顺序结构…

【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

【JAVA】SpringBoot mongodb 分页、排序、动态多条件查询及事务处理 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mongodb ↓ -->&…

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

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

如何开发有趣而富有创意的营销小游戏

在数字化时代&#xff0c;企业通过创意而独特的方式与目标受众互动&#xff0c;已成为提高品牌知名度和用户参与度的重要手段之一。其中&#xff0c;设计一款引人入胜的营销小游戏&#xff0c;不仅能吸引用户的眼球&#xff0c;还能有效传达品牌信息。以下是一些建议&#xff0…

人工智能-注意力机制之注意力汇聚:Nadaraya-Watson 核回归

查询&#xff08;自主提示&#xff09;和键&#xff08;非自主提示&#xff09;之间的交互形成了注意力汇聚&#xff1b; 注意力汇聚有选择地聚合了值&#xff08;感官输入&#xff09;以生成最终的输出。 本节将介绍注意力汇聚的更多细节&#xff0c; 以便从宏观上了解注意力机…

canvas高级动画001:文字瀑布流

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】

本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程&#xff0c;超详细实战教程相关的博文在前文有相应的系列&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…

electron windows robotjs 安装教程

Robotjs 安装 前言第一步 : 安装python第二步 : 安装Visual Studio 2022第三步 : 安装robotjs 前言 robotjs可以控制鼠标键盘&#xff0c;获取屏幕内容&#xff0c;配合electron可做很多自动化操作。windows下配置环境有很多坑&#xff0c;很多文章都太旧了。试了很多次发现了…

杰发科技AC7801——Flash模拟EEP内存分布情况

简介 本文记录了在使用AutoChips芯片Flash模拟EEP过程中的一些理解 核心代码如下 #include <stdlib.h> #include "ac780x_sweeprom.h" #include "ac780x_debugout.h"#define SWEEPROM_SIZE (2048UL) /* Ssoftware eeprom size(Byte) */ #define TE…

在新疆乌鲁木齐的汽车托运

在新疆乌鲁木齐要托运的宝! 看过来了 找汽车托运公司了 连夜吐血给你们整理了攻略!! ⬇️以下&#xff1a; 1 网上搜索 可以在搜索引擎或专业的货运平台上搜索相关的汽车托运公司信息。在网站上可以了解到公司的服务范围、托运价格、运输时效等信息&#xff0c;也可以参考其他车…

播放器开发(四):多线程解复用与解码模块实现

学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 前言 根据第一章内容&#xff0c;我们首先可以先把解复用和解码模块完成&#xff0c;其中需要使用到多线程以及队列&#xff0c;还需要使用FFmpeg进行解复用和解码动作的实现。 创建BaseQueue基类 BaseQueue.h…

BUUCTF 谁赢了比赛? 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 小光非常喜欢下围棋。一天&#xff0c;他找到了一张棋谱&#xff0c;但是看不出到底是谁赢了。你能帮他看看到底是谁赢了么&#xff1f; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附…

代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 392.判断子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…