【问题标题】:Why does this C# method not produce the right screenshot?为什么这个 C# 方法不能生成正确的屏幕截图?
【发布时间】:2020-04-24 10:31:10
【问题描述】:

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

        [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 窗口在前台,我得到父窗口的屏幕截图(见下文)。

我需要如何更改我的代码才能使其变为

一个。即使窗口不在前台也可以工作并且

b.只捕获字数统计窗口(而不是其父窗口)?

Here 是代码。

【问题讨论】:

  • 这不是经验,但我想说您需要尝试找到该主窗口的正确子窗口。
  • 不是您在自己提供的链接中寻找的所有答案

标签: c# winforms screenshot screen-capture


【解决方案1】:

这是你的问题:

scrivenerProcess.MainWindowHandle

From the documentation:

主窗口是当前拥有焦点的进程打开的窗口

在您的屏幕截图中,您所访问的窗口没有具有焦点(它具有带有灰色文本的白色背景,表明它处于非活动状态)。

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

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2021-04-16
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多