0

这是我的代码:

 public string selectedProgram;

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    private static extern bool GetWindowRect(IntPtr hWnd, Rectangle rect); 

    private void button2_Click(object sender, EventArgs e)
    {
        Process[] process = Process.GetProcesses();
        foreach (var p in process)
        {
            selectedProgram = listView1.SelectedItems.ToString();
            Rectangle bonds = new Rectangle();
            GetWindowRect(Handle, bonds);  
            Bitmap bmp = new Bitmap(bonds.Width, bonds.Height);
            using (var gfx = Graphics.FromImage(bmp))
            {
                gfx.CopyFromScreen(bonds.Location, Point.Empty, bonds.Size);
                pictureBox1.Image = bmp;
                frm2.Show();
                frm2.pictureBox1.Image = pictureBox1.Image;
            }
        }

我收到一个错误或一些绿色突出显示GetWindowRect(Handle, bonds);

A call to PInvoke function 'Screen Shot!WindowsFormsApplication1.Form3::GetWindowRect' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

我该如何解决这个问题,以便我可以获取其他应用程序窗口的屏幕截图?

4

2 回答 2

1

您的声明缺少“out”并且使用了错误的矩形类型,它应该如下所示:

private static extern bool GetWindowRect(IntPtr hWnd, out RECT rect);

你称之为:

GetWindowRect(Handle, out bonds);

Rectangle 还需要是 WinApi 矩形,而不是 .net 类。有关其定义,请参见此处。惯例是称它为 RECT 而不是 Rectangle。

于 2012-07-09T06:40:48.537 回答
1

查看pinvoke.net(很好的参考),签名GetWindowRect应该是:

public static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);

它也可以这样做,这不需要您定义自定义RECT结构:

public static extern bool GetWindowRect(IntPtr hwnd, out Rectangle lpRect);

如果这不起作用,您可以RECT基于此页面定义一个结构,并使用:

public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

pinvoke.net 页面上RECT显示了如何在 和 之间进行RECT转换Rectangle

于 2012-07-09T14:07:30.397 回答