C# 两种方法截取活动窗口屏幕,实现窗体截图

news2024/11/27 8:43:14

方法1,截屏内容仅包括活动窗口界面,而方法2是从屏幕范围取图,截屏内容会包括屏幕上所有内容。例如有一些程序在桌面顶层显示半透明的悬浮窗,用方法2截屏就会包括这些内容,并不是单纯的活动窗口内容。
方法1,对一些有渐变效果的边框,截图会包括边框范围。方法2则可以把截屏范围限制在程序窗口,截屏范围更准确。

方法1:
1. 获得活动窗口的句柄
2. 根据句柄获得窗口坐标和大小.
3. 指定复制范围,从屏幕复制图像

IntPtr handle = Win32Api.GetForegroundWindow();
Win32Api.RECT rect;
int result = Win32Api.DwmGetWindowAttribute(hwnd, Win32Api.DWMWA_EXTENDED_FRAME_BOUNDS, out rect, Marshal.SizeOf(typeof(Win32Api.RECT)));

int width = rect.Width;
int height = rect.Height;
Bitmap bmp = new Bitmap(width, height);

using (Graphics g = Graphics.FromImage(bmp))
{
    g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size);
}

bmp.Save(screenshotPath, ImageFormat.Png);

方法2:
1. 获得活动窗口的句柄
2. 根据句柄获得 device context (DC) 
3. 从DC复制 bit-block

Win32Api.RECT rect;
Win32Api.GetWindowRect(hwnd, out rect);

Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);

IntPtr hdcDest = g.GetHdc();
IntPtr hdcSrc = Win32Api.GetWindowDC(hwnd);
Win32Api.BitBlt(hdcDest, 0, 0, rect.Width, rect.Height, hdcSrc, 0, 0, Win32Api.SRCCOPY);
g.ReleaseHdc(hdcDest);
Win32Api.ReleaseDC(hwnd, hdcSrc);
g.Dispose();
bmp.Save(screenshotPath, ImageFormat.Png);

win32 api调用网上都有,这里就不再重复了。

另外,截全屏幕,代码如下 :

public static void SaveFullScreenshot(string path)
        {
            Rectangle bounds = Screen.GetBounds(DrawingPoint.Empty);

            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(DrawingPoint.Empty, DrawingPoint.Empty, bounds.Size);
                }

                bitmap.Save(path, ImageFormat.Png);
            }
        }

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

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

相关文章

【数据结构与算法】:10道链表经典OJ

目录 1. 移除链表元素2. 反转链表2.1反转指针法2.2 头插法 3. 合并两个有序链表4. 分隔链表5. 环形链表6. 链表的中间节点7. 链表中倒数第K个节点8. 相交链表9. 环形链表的约瑟夫问题10. 链表的回文结构 1. 移除链表元素 思路1:遍历原链表,将 val 所在的…

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先! DySample超轻量动态上采样算子全文戳这!here! 详细的改进教程以及源码&am…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

《中医病证分类与代码》-中医疾病分类数据库

《中医病症分类与代码》由国家中医药管理局2020年底修订,目的是为中医疾病及证候的分类提供统一的规范。规定2021年起,各中医机构的临床科室及基层中医药的医师都应按照最新修订的《中医病症分类与代码》规范来填报病案及病历。 中医病证分类与代码数据库…

js base64 img 转 file

转化canvas的图像 打印canvas图像的dataurl const imgDataUrl canvas.toDataURL();console.log(imgDataUrl)上传的图像编码 1,把base64编码转为文件对象第一个参数dataUrl是一个base64的字符串。第二个参数是文件名可以随意命名funtion base64toFile(dataurl, filename fil…

基于ADB的Scrcpy实现电脑控制手机

Scrcpy是一个开源的,基于ADB(Android 调试桥)的手机到电脑上的投屏操控的实现,本文将介绍如何搭建开发环境,使得在Windows系统中去控制投屏的安卓手机。 1. 安装投屏软件 下载Scrcpy软件到电脑上,该软件中…

推荐一个超好用的测试工具,值得体验!

在软件开发领域中,测试是确保质量与可靠性的必要环节。俗话说得好“工欲善其事,必先利其器”,测试工具越简单、用户友好度越高,开发者编写测试的意愿度就越高。 为了满足大家的测试需求,MoonBit 标准库最近引入了 ins…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

安装SSMS出现错误和SSMS连接数据库失败

1.点击图片下安装的时候,出现0x80070643错误 解决办法: 1,如果是是第一次安装的话,重新启动电脑,把原来下载的SSMS删除掉,在重新下载安装 2.如果是原来就下载过,先…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中,我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤,并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能,将构建好的镜像利用在自动化测试作业中。在今天的文章中,我们将重点讨论如何构建 JMeter 的 Docker 镜像…

彻底解决 pyshark 库 TShark not found

使用 python 运行 github 某个项目处理 pcap 包时遇到如下报错: (先安装了 pyshark 库) pyshark.tshark.tshark.TSharkNotFoundException: TShark not found. Try adding its location to the configuration file. Searched these paths: […

现在谷歌企业号需要验证企业官网和法人信息,才能注册成功或提审应用?

众所周知,近年来,随着谷歌上架行业的发展,以及开发者们上架马甲包或矩阵式上架的操作,谷歌官方对于开发者账号的审核越来越严格了。 从一开始需要提供收付款卡银行流水账单,到后续引入邓白氏码等更为严格的账号验证机制…

【学习笔记】Vue3源码解析:第四部分- runtime-dom(1)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码) 第四部分-:(对应课程的第24-26节) 第24节:《理解runtime-dom的作用》 源码中除了 dep.ts ,其余基…

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…

边缘计算网关主要有哪些功能?-天拓四方

随着物联网(IoT)的快速发展和普及,边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备,边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏:http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter,迪米特法则)。尽LoD不像SOLID、KI…

面试:lock 和 synchronized

一、语法层面 synchronized 是关键字,源码在jvm中,用c语言实现Lock 是接口,源码由jdk提供,用java语言实现使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法…

Linux中进程和计划任务

一.程序 1.什么是程序 (1)是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具 (2)用于描述进程要完成的功能,是控制进程执行的指令集 二.进程 1.什么是进程…

量化过程信息损耗分析(MATLAB)

MATLAB代码 clear_all; Mrand(5,5)*100;% 假设M是待转换的矩阵 a min(M(:)); b max(M(:));% 将M映射到[0, 255] M_mapped functionA(M, a, b); M_mapped_floorfloor(M_mapped); % 将M_mapped恢复到原始范围 M_original functionB(M_mapped_floor, a, b);disp(M); disp(M_m…

【吊打面试官系列】Java高并发篇 - 什么是多线程中的上下文切换?

大家好,我是锋哥。今天分享关于 【什么是多线程中的上下文切换?】面试题,希望对大家有帮助; 什么是多线程中的上下文切换? 在上下文切换过程中,CPU 会停止处理当前运行的程序,并保存当前程序运行…