为什么我的应用程序告诉我我的剪贴板是空的,但显然不是?

时间:2016-09-30 02:07:59

标签: c# .net console-application screenshot clipboard

我试图用控制台应用程序截取我的屏幕截图,然后将其保存到我的桌面但是由于某种原因..它告诉我,当我的剪贴板显示为空时,我的剪贴板是空的。如果你检查代码,你可以看到我按PrintScreen,当你这样做时,它将它保存到剪贴板。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ScreenshotConsole
{
    class Program
    {

        static void Main(string[] args)
        {
            screenshot();
            Console.WriteLine("Printescreened");
            saveScreenshot();
            Console.ReadLine();
        }


        static void screenshot()
        {
            SendKeys.SendWait("{PRTSC}");
        }

        static void saveScreenshot()
        {
            //string path;
            //path = "%AppData%\\Sys32.png"; // collection of paths
            //path = Environment.ExpandEnvironmentVariables(path);

            if (Clipboard.ContainsImage() == true)
            {
                Image image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
                image.Save("image.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                Console.WriteLine("Clipboard empty.");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:5)

屏幕截图需要一些时间,所以在按下{PRTSC}之后你应该添加延迟:

static void screenshot()
{
    SendKeys.SendWait("{PRTSC}");
    Thread.Sleep(500);
}

更新

好的,我弄清楚了,将STAThreadAttribute添加到您的主要方法:

    [STAThread]
    static void Main(string[] args)
    {
        screenshot();
        Console.WriteLine("Printescreened");
        saveScreenshot();
        Console.ReadLine();
    }

MSDN说:

  

Clipboard类只能在设置为单线程单元(STA)模式的线程中使用。要使用此类,请确保使用STAThreadAttribute属性标记Main方法。

More detail