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

本文关键字:我的 告诉我 剪贴板 为什么 应用程序 | 更新日期: 2023-09-27 18:09:47

我试图用控制台应用程序截取屏幕截图,然后将其保存到我的桌面,但出于某种原因…它告诉我,我的剪贴板是空的,而显然它不是…如果你检查代码,你可以看到我按下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.");
            }
        }
    }
}

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

截图需要一些时间,所以你应该在按下{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显示:

剪贴板类只能在设置为单线程公寓(STA)模式的线程中使用。要使用这个类,请确保您的Main方法被STAThreadAttribute属性标记。

更详细

相关文章: