我正在开发一个应用程序,要求程序截取监视器的屏幕截图,并让用户与生成的位图进行交互。我编写了代码(使用Graphics.CopyFromScreen
),它将为任何连接的监视器完成此任务。我正在使用两台显示器,这使我可以在一台显示器上打开一些有趣的应用程序,在另一台显示器上打开我的软件。在一个监视器环境中,所有屏幕截图代码都会拍摄我的程序(必须在屏幕上最大化)。
有没有办法在我的应用程序下截取该区域的屏幕截图?这可能是桌面,但如果我的应用程序没有运行,则更有可能是Windows的任何排列都处于活动状态。理论上,最小化我的应用程序,截取显示的内容,然后取消最小化我的应用程序将起作用,除了我将在用户与我的软件交互时经常和异步地拍摄这些屏幕截图,所以它需要是在用户不知道应用程序被最小化或中断的情况下无缝完成。
我拍摄截图的代码如下(从其他代码中提取,请原谅这个混乱),万一有理由查看它。
public Bitmap getScreenshot()
{
Rectangle rc = Screen.AllScreens[0].WorkingArea; // the OTHER monitor
Rectangle rcClient = this.ClientRectangle;
Bitmap memoryImage = null;
try
{
int borderSizeH = 0, borderSizeW = 0;
memoryImage = new Bitmap(rc.Width - 2 * borderSizeW, rc.Height - 2 * borderSizeH, PixelFormat.Format32bppArgb);
Size rc2 = new Size(rc.Width, rc.Height);
using (Graphics memoryGrahics = Graphics.FromImage(memoryImage))
{
memoryGrahics.CopyFromScreen(rc.Location.X + borderSizeW, rc.Location.Y + borderSizeH, 0, 0, rc2, CopyPixelOperation.SourceCopy);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Capture failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return memoryImage;
}