3

dll呼び出しを介して外部に描画されているpictureBoxがあります。

private void myPictureBox_Paint(object sender, PaintEventArgs e)
{
     dllClass.RefreshEx(LWHANDLE, 0, 0);
}

これは機能していますが、そのピクチャボックスのスクリーンショットを取得する必要がありますが、機能していません。

これが私が試したことです:

        Control ctrlToDraw = myPictureBox;

        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(ctrlToDraw.Width, ctrlToDraw.Height);
        ctrlToDraw.DrawToBitmap(bmp, ctrlToDraw.ClientRectangle); 

また、Windows API を介して実行しようとしましたが、上記のコードとまったく同じ結果、つまり空白の (null ではない) 画像が得られます。

画面全体のスクリーンショットを撮る以外に、誰か提案を挙げてもらえますか?

4

2 に答える 2

4

外部プログラムをどの程度制御できるか、または画像ボックスにどのように描画するかはわかりませんが、createGraphics を使用している場合は機能しません。

private void button1_Click(object sender, EventArgs e)
    {
        //here I am calling the graphics object of the Picture Box, this will draw to the picture box
        //But the DrawToBitmap, will not reflect this change, and once the Picturebox needs to be updated, this will disappear.
        Graphics g = pictureBox1.CreateGraphics();
        g.DrawRectangle(Pens.Blue, 10, 10, 20, 20);

        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(pictureBox1.Width, pictureBox1.Height);
        Rectangle bounds = new Rectangle(Left, Top, Width, Height);
        pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
        //Draws whatever is in the PictureBox to the Forms BackgroundImage
        this.BackgroundImage = bmp;
        //It will not draw the Blue rectangle

    }

外部プログラムがビットマップに描画する場合、そのビットマップをピクチャボックスの背景に設定できます

    Bitmap buffer;
    public Form1()
    {
        InitializeComponent();
        buffer = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        //draw to the bitmap named buffer
        using (Graphics g = Graphics.FromImage(buffer))
        {
            g.DrawRectangle(Pens.Blue, 10, 10, 20, 20);
        }
        //assign the picturebox image to buffer
        pictureBox1.Image = buffer;

        //Now this will show the blue rectangle
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(pictureBox1.Width, pictureBox1.Height);
        Rectangle bounds = new Rectangle(Left, Top, Width, Height);
        pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);

        this.BackgroundImage = bmp;
    }

編集 三回目のチャーム権

これはスクリーン ショットを撮り、ピクチャ ボックスを切り取ってから、フォームの背景を変更して、それが機能したことを証明します。

追加する必要があります

using System.Drawing.Imaging;

ピクセル形式用です。

 private void button1_Click(object sender, EventArgs e)
    {
        using (Graphics G = pictureBox1.CreateGraphics())
        {
            G.DrawRectangle(Pens.Blue, 10, 10, 10, 10);
        }
        Bitmap BMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                        Screen.PrimaryScreen.Bounds.Height,
                                        PixelFormat.Format32bppArgb);
        using (Graphics GFX = Graphics.FromImage(BMP))
        {
            GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                Screen.PrimaryScreen.Bounds.Y,
                                0, 0,
                                Screen.PrimaryScreen.Bounds.Size,
                                CopyPixelOperation.SourceCopy);
        }
        Bitmap YourPictureBoxImage = new Bitmap(pictureBox1.Width,pictureBox1.Height);
        using (Graphics g = Graphics.FromImage(YourPictureBoxImage))
        {
            Point np = pictureBox1.PointToScreen(new Point(0, 0));
            g.DrawImage(BMP,new Rectangle(0,0,100,100),new Rectangle(np,pictureBox1.Size),GraphicsUnit.Pixel);
        }

        this.BackgroundImage = YourPictureBoxImage;
    }
于 2012-05-24T16:36:25.727 に答える
-2

Alt + PRINTSCREEN を使用して、アクティブなウィンドウだけのスクリーンショットを撮ることができます。これにより、現在アクティブなウィンドウがビットマップとしてクリップボードにキャプチャされます。それをビットマップ編集ツールに貼り付け、必要な領域だけを切り取ります。

または、Evernote バージョン 2 の古いスクリーン クリッパーなど、画面上でターゲット領域をトリミングできるスクリーン キャプチャ ユーティリティを使用します。

于 2012-05-24T16:22:25.393 に答える