0

我用 C# 编写了一个简单的图像上传器。这是我的代码:

using System;
using System.Collections.Specialized;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;

namespace Snappx
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            GlobalHook.HookManager.KeyUp += new KeyEventHandler(MyKeyUp);
            CheckForIllegalCrossThreadCalls = false;
            new Task(this.Hide).Start();
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Environment.Exit(-1);
        }

        string ORIGINIM;
        async void MyKeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.PrintScreen)
            {
                await GetImage();
                e.Handled = true;
            }
            else e.Handled = false;
        }

        String img = @"temp";
        async Task GetImage()
        {
            Rectangle bounds = Screen.GetBounds(Point.Empty);
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
                }
                bitmap.Save(img, ImageFormat.Png);
            }

            using (var w = new WebClient())
            {
                var values = new NameValueCollection { { "key", "85684005b7d4faa4c33ee480010d4982" }, { "image", Convert.ToBase64String(File.ReadAllBytes(img)) } };

                notifyIcon1.ShowBalloonTip(3, "Uploading", "Uploading image to Imgur", ToolTipIcon.Info);

                w.UploadProgressChanged += new UploadProgressChangedEventHandler(wc_UploadProgressChanged);
                Task<byte[]> x = w.UploadValuesTaskAsync(new Uri("http://imgur.com/api/upload.xml"), values);
                byte[] response = await x;

                while (w.IsBusy) System.Threading.Thread.Sleep(500);
                File.Delete(img);

                ORIGINIM = Convert.ToString(XDocument.Load(new MemoryStream(response)));
                ORIGINIM = ORIGINIM.Substring(ORIGINIM.LastIndexOf("<original_image>")).Replace("<original_image>", "");
                ORIGINIM = ORIGINIM.Substring(0, ORIGINIM.LastIndexOf("</original_image>")).Replace("</original_image>", "");

                Clipboard.SetText(ORIGINIM);
                if (!File.Exists(@"Uploads.txt")) File.Create(@"Uploads.txt");
                new StreamWriter(@"Uploads.txt").WriteLine(ORIGINIM);
                notifyIcon1.ShowBalloonTip(3, "Done", "URL copied to clipboard.", ToolTipIcon.Info);
            }
        }

        private void wc_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
        {
            int percentage = e.ProgressPercentage * 2;
            notifyIcon1.ShowBalloonTip(3, "Uploading", (percentage).ToString() + "%", ToolTipIcon.Info);
        }
    }
}

首先,当没有 Uploads.txt 文件时,它返回一个异常处理程序。然后我第二次运行它,它会创建它。有没有更简单的存储方法?

第二个问题:

我是否可以添加两个不同的选项,一个用于捕获全屏,一个用于选择屏幕区域。

如何将它与我的代码集成?你能发一下吗?

4

1 回答 1

0

而不是(!File.Exists(@"Uploads.txt")) File.Create(@"Uploads.txt")试试这个

using (StreamWriter sw = new StreamWriter(File.Open(@"Uploads.txt", FileMode.OpenOrCreate)))
{
    sw.WriteLine(ORIGINIM);
}

它在第二次尝试中起作用的原因是因为您没有在文件上创建锁定File.Create- 现有逻辑打开文件,创建一个FileStream,然后您尝试StreamWriter在同一个文件上打开。相反,您应该StreamWriter通过将 传递FileStream到其构造函数来创建 ,如上面的示例所示。

于 2013-08-22T01:11:57.993 回答