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 も、.net クラスではなく、WinApi の四角形である必要があります。その定義については、こちらを参照してください。規則では、Rectangle ではなく RECT と呼びます。

于 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の間の変換方法が示されています。RECTRectangle

于 2012-07-09T14:07:30.397 に答える