【问题标题】:Take screenshot in process window在进程窗口中截屏
【发布时间】:2017-10-26 14:28:46
【问题描述】:

我正在尝试对 Windows 7 64 位中的进程窗口进行屏幕截图,问题是我总是在以下行中出错:

var bmp = new Bitmap (width, height, PixelFormat.Format32bppArgb);

说“无效参数”,我扔了一个看看错误,宽度和高度总是0。

以前在 32 位中它工作得很好,但现在在 64 位中它不再工作了。

代码:

public void CaptureApplication()
{
    string procName = "firefox";

    var proc = Process.GetProcessesByName(procName)[0];
    var rect = new User32.Rect();
    User32.GetWindowRect(proc.MainWindowHandle, ref rect);

    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;

    var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    Graphics graphics = Graphics.FromImage(bmp);
    graphics.CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy);

    bmp.Save("c:\\tmp\\test.png", ImageFormat.Png);
}

private class User32
{
    [StructLayout(LayoutKind.Sequential)]
    public struct Rect
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
}

如何解决这个错误?

【问题讨论】:

  • 可能是因为进程名是firefox.exe?
  • 我做了,还是一样的错误。
  • 您还应该检查 GetWindowRect 的返回值 - 如果它返回 IntPtr.Zero,则该步骤出现问题。
  • 我已经试过了,总是零,我不明白为什么,在我擅长32位之前
  • GetProcessesByName 返回了多少条目?我没有 FireFox,但同时使用 GoogleChrome 和 Internet Explorer 进行测试,为条目 0 返回的矩形将所有 4 个边界都设为 0,但是如果我检查数组中的下一个元素 (var proc = Process.GetProcessesByName(procName)[1] ; ) 我得到了矩形的合理值。使用 Internet Explorer 我有 1 个实例和 5 个选项卡 - 这会导致返回 5 个进程。另一方面,Chrome 有 6 个进程,用于单个选项卡的单个实例。

标签: c#


【解决方案1】:

获取 Firefox 的进程返回一系列进程,您正在寻找具有实际大小的矩形的进程,这是主要进程。

Process[] procs = Process.GetProcessesByName(procName);
var rect = new User32.Rect();
int width = 0;
int height = 0:
foreach (Process proc in procs)
{
    User32.GetWindowRect(proc.MainWindowHandle, ref rect);
    width = rect.right - rect.left;
    height = rect.bottom - rect.top;
    // break foreach if an realistic rectangle found => main process found
    if (width != 0 && height != 0)
    {
        break;
    }
}

【讨论】:

  • 这似乎适用于 Internet Explorer(1 个实例,4 个选项卡)——只有 1 个具有非零矩形的进程。使用谷歌浏览器(1 个实例单选项卡)虽然有 7 个进程和 3 个非零大小的矩形(都一样) - 所以不适用。我没有 FireFox,所以无法对此发表评论。
  • @PaulF 进行了更改,允许 0 值但不允许在矩形中更有意义。它现在也适用于 chrome 吗?由我来工作,但我在第二个屏幕上打开了 chrome。
  • 感谢您的帮助。
  • 正如我所说 - 我得到了多个 Chrome 进程,它们都具有相同的(非零)宽度和高度 - 但如果这适用于 FireFox,那就太好了。我发现找到正确的 chrome & 进程的唯一方法是检查命令行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2021-11-07
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多