如何获得控件的屏幕截图? DrawToBitmap不起作用

我有一个通过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来实现它,但它产生的结果与上面的代码完全相同:一个空白(非空)图像。

除了截取整个屏幕的屏幕截图外,还有人可以提出一些建议吗?

我不知道你对外部程序有多少控制,或者它如何绘制到你的图片框,但如果你使用的是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; } 

编辑第三次魅力吧

这将拍摄一个屏幕截图,将图片框剪掉,然后我更改了表格背景,只是为了certificate它有效。

你需要添加

 using System.Drawing.Imaging; 

它适用于Pixel格式。

  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; } 

您可以使用ALT + PRINTSCREEN截取活动窗口的屏幕截图。 这会将当前活动窗口捕获为剪贴板的位图。 将其粘贴到位图编辑工具中,裁剪到您想要的区域。

或者使用屏幕捕获实用程序,允许在屏幕上裁剪目标区域,例如Evernote版本2的旧屏幕剪辑器。