首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个C#方法不能生成正确的屏幕截图?

为什么这个C#方法不能生成正确的屏幕截图?
EN

Stack Overflow用户
提问于 2020-04-24 10:31:10
回答 1查看 96关注 0票数 4

我想在PNG文件中保存标题以- Scrivener结尾的窗口的快照。为此,我编写了以下方法 (基于答案):

代码语言:javascript
复制
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Process[] processes  = Process.GetProcesses();
            Process scrivenerProcess = null;
            foreach (Process curProcess in processes)
            {
                Console.WriteLine("Name: " + curProcess.ProcessName + ", title: " + curProcess.MainWindowTitle);
                if (curProcess.MainWindowTitle.EndsWith("- Scrivener"))
                {
                    scrivenerProcess = curProcess;
                    break;
                }
            }
            if (scrivenerProcess == null)
            {
                Console.WriteLine("Scrivener not found");
                return;
            }

            var rect = new RECT();

            GetWindowRect(new HandleRef(this, scrivenerProcess.MainWindowHandle), out rect);

            int width = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;
            var bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics graphics = Graphics.FromImage(bmp);
            graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0, new System.Drawing.Size(width, height), CopyPixelOperation.SourceCopy);

            bmp.Save("C:\\usr\\dp\\ref\\marcomm\\2020_04_22_wordCounter\\2020-04-24-TestScreenshot.png", ImageFormat.Png);

            Console.WriteLine("Heyo!");
        }

此代码有几个问题:

首先,如果在调用代码时,我想捕获的应用程序(Scrivener)不在前台,则生成的屏幕截图是空的。

其次,如果Scrivener窗口位于前台,我将得到父窗口的屏幕截图(见下文)。

我需要如何修改我的代码才能使它

即使窗口不在前台,也要工作。

只捕获单词计数窗口(而不是其父窗口)?

这里是代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 10:43:13

你的问题是:

代码语言:javascript
复制
scrivenerProcess.MainWindowHandle

从文件中

主窗口是由当前具有焦点的进程打开的窗口。

在你的截图中,你想要的窗口是而不是有焦点(它有一个带灰色文本的白色背景,表示它是不活动的)。

不幸的是,要枚举进程的其他窗口,您需要使用P/Invoke,因为它们不是通过Process类公开的。EnumChildWindows

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61406301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档