C# CopyFromScreen返回表单后面的任何内容的图像

C# CopyFromScreen返回表单后面的任何内容的图像,c#,windows,winforms,C#,Windows,Winforms,我这里有个严重的问题。Iam编程一种工具,用户可以在其中为开关设备设计控制柜。隔间用面板和画框绘制,工作良好,看起来不错 现在我想制作一个导出函数,将设计好的隔间导出为pdf文件 到目前为止还不错,功能正常-仅在我的电脑上! 我使用CopyFromScreen获取显示隔间的面板的屏幕截图,将其保存到一个文件中,并将其放入pdf文件中(我还尝试使用DrawToBitmap获取面板的图片,但这无法正常工作,因为它正在绘制一些图片框而不是其他图片框)。在我的计算机上,它正确地捕获面板并在pdf中显示正

我这里有个严重的问题。Iam编程一种工具,用户可以在其中为开关设备设计控制柜。隔间用面板和画框绘制,工作良好,看起来不错

现在我想制作一个导出函数,将设计好的隔间导出为pdf文件

到目前为止还不错,功能正常-仅在我的电脑上! 我使用CopyFromScreen获取显示隔间的面板的屏幕截图,将其保存到一个文件中,并将其放入pdf文件中(我还尝试使用DrawToBitmap获取面板的图片,但这无法正常工作,因为它正在绘制一些图片框而不是其他图片框)。在我的计算机上,它正确地捕获面板并在pdf中显示正确的图片,但在其他每台计算机上,它都会拍摄表单后面的图片。这是相当混乱的,因为我不知道为什么它应该这样做,为什么它在我的系统上工作。到目前为止,我尝试了一些方法来强制窗口位于顶部,但没有任何效果,每个人都可以看到桌面或后面窗口的图片

代码:

void takeScreenshot()
    {
        this.TopMost = true;
        this.BringToFront();
        this.Focus();
        Application.DoEvents();

        System.Drawing.Rectangle bounds = Mainpanel.Bounds;
        bounds.Width = bounds.Width - 6;
        bounds.Height = bounds.Height - 4;
        using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.CopyFromScreen(Mainpanel.PointToScreen(new Point()).X + 3, Mainpanel.PointToScreen(new Point()).Y + 2, 0, 0, bounds.Size);
            }
            bitmap.Save(Application.StartupPath + "\\data\\programdata\\temppic.bmp");
        }
        this.TopMost = false;
    }
我其实很绝望,没有出口的计划是无用的

有人知道如何解决这个问题吗

Jonathan使用此代码

void takeScreenshot()
    {
        Application.DoEvents();
        System.Drawing.Rectangle bounds = Mainpanel.Bounds;
        bounds.Width = bounds.Width - 6;
        bounds.Height = bounds.Height - 4;

        using (Bitmap bitmap = new Bitmap(Mainpanel.Width, Mainpanel.Height))
        {
            Mainpanel.DrawToBitmap(bitmap, new Rectangle(3, 2, bounds.Width, bounds.Height));
            bitmap.Save(Application.StartupPath + "\\data\\programdata\\temppic.bmp");
        }
    }

Application.DoEvents()是邪恶的!尝试删除
BringToFront
Focus
。这可能有帮助,也可能没有。不一定要画,你应该尝试另一种方法。使用面板并使用OnPaint处理程序或Paint事件自己绘制所有内容。之后,你可以在位图上绘制所有内容并轻松导出位图。我知道这是最好的方法。。但是我用了很多不同的盒子,可以通过拖放来移动,这只是更简单的方法。好吧,现在我知道我应该用onPaint完成它,但为时已晚。我没有首先使用bringtofront和focus。。我在程序像现在这样运行之后添加了它们