我正在开发一个应用程序,该应用程序需要程序截取监视器的屏幕截图,并让用户与生成的位图进行交互。我已经编写了代码(使用Graphics.CopyFromScreen
),它将为任何连接的监视器完成此任务。不过,我正在使用两台显示器,这使我可以在一台显示器上打开一些有趣的应用程序,而在另一台显示器上打开我的软件。在一个监视器环境中,屏幕截图代码所做的只是给我的程序拍照(它必须在屏幕上最大化)。
有什么方法可以截取我的应用程序下的区域吗?这可能是桌面,但如果我的应用程序没有运行,则更有可能是处于活动状态的任何窗口排列。理论上,最小化我的应用程序,截取显示的屏幕截图,然后取消最小化我的应用程序会起作用,除非我将在用户与我的软件交互时频繁且异步地截取这些屏幕截图,所以它需要在用户不知道应用程序被最小化或中断的情况下无缝完成。
我的截图代码如下(从其他代码中提取,所以请原谅混乱),以防有理由查看它。
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;
}