【发布时间】: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#