吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 290|回复: 2
收起左侧

[经验求助] 各位大神C#如何正确截取缩放的窗口

[复制链接]
cccfind911 发表于 2024-8-13 22:29
50吾爱币
[C#] 纯文本查看 复制代码
        private void CaptureScreen1()
        {
            // 获取窗体客户区域大小
            Rectangle bounds = this.ClientRectangle;

            // 创建与调整后区域大小相匹配的 Bitmap 对象
            memoryImage = new Bitmap(bounds.Width, bounds.Height);

            using (Graphics memoryGraphics = Graphics.FromImage(memoryImage))
            {
                // 获取系统的DPI
                float dpiX = memoryGraphics.DpiX;
                float dpiY = memoryGraphics.DpiY;

                // 计算缩放比例
                float scaleX = dpiX / 96.0f;
                float scaleY = dpiY / 96.0f;

                // 调整捕获区域的大小
                bounds.Width = (int)(bounds.Width * scaleX);
                bounds.Height = (int)(bounds.Height * scaleY);

                // 调整起始点
                Point startPoint = new Point((int)(this.PointToScreen(new Point(0, 0)).X * scaleX), (int)(this.PointToScreen(new Point(0, 0)).Y * scaleY));

                // 使用调整后的起始点和大小进行屏幕捕获
                memoryGraphics.CopyFromScreen(startPoint, new Point(0, 0), bounds.Size);
            }

            // 获取 Label1 的值作为文件名
            string fileName = label1.Text + ".png";

            // 将图片保存为 PNG 文件,文件名为 label1 的值
            memoryImage.Save(fileName, ImageFormat.Png);
        }

各位大神,我想设计个功能就是截取当前窗体并保存为png文件,WIN系统缩放与布局里文本、应用等项目大小是100%时可以正常截取并保存的,但是缩放为125%、150%、200%……时该功能不能正确截取当前窗体,我该怎么修改?

最佳答案

查看完整内容

获取缩放率错误 [mw_shl_code=csharp,true] [DllImport("gdi32.dll", EntryPoint = "GetDeviceCaps", SetLastError = true)] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); private void CaptureScreen() { // 获取窗体客户区域大小 Rectangle bounds = this.ClientRectangle; var g = Graphics.FromHwnd(IntPtr. ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

flyer_2001 发表于 2024-8-13 22:29
本帖最后由 flyer_2001 于 2024-8-15 00:21 编辑

获取缩放率错误
[C#] 纯文本查看 复制代码
        [DllImport("gdi32.dll", EntryPoint = "GetDeviceCaps", SetLastError = true)]
        public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
        private void CaptureScreen()
        {
            // 获取窗体客户区域大小
            Rectangle bounds = this.ClientRectangle;
            
            var g = Graphics.FromHwnd(IntPtr.Zero);
            IntPtr hdc = g.GetHdc();
            float scaleX = (float)GetDeviceCaps(hdc, 118) / (float)GetDeviceCaps(hdc, 8);
            float scaleY = (float)GetDeviceCaps(hdc, 117) / (float)GetDeviceCaps(hdc, 10);
            // 调整捕获区域的大小
            bounds.Width = (int)(bounds.Width * scaleX);
            bounds.Height = (int)(bounds.Height * scaleY);

            // 创建与调整后区域大小相匹配的 Bitmap 对象
            Bitmap memoryImage = new Bitmap(bounds.Width, bounds.Height);

            using (Graphics memoryGraphics = Graphics.FromImage(memoryImage))
            {
                // 调整起始点
                Point startPoint = new Point((int)(this.PointToScreen(new Point(0, 0)).X * scaleX), (int)(this.PointToScreen(new Point(0, 0)).Y * scaleY));

                // 使用调整后的起始点和大小进行屏幕捕获
                memoryGraphics.CopyFromScreen(startPoint, new Point(0, 0), bounds.Size);
            }

            // 获取 Label1 的值作为文件名
            string fileName = label1.Text + ".png";

            // 将图片保存为 PNG 文件,文件名为 label1 的值
            memoryImage.Save(fileName, ImageFormat.Png);
        }
 楼主| cccfind911 发表于 2024-8-15 20:39
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 18:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表