Всем привет. Понадобилась кнопочка, которая делает скриншот текущей программы и заливает его на сервер. Подключаем 4 либы. Все это будем делать на старом любимом xNet using xNet; using System.Drawing; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Diagnostics; Код using xNet; using System.Drawing; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Diagnostics; Где-нибудь в начале объявляем переменные для названия скриншота и текущего времени/даты string screenshotName; string nowTime = DateTime.Now.ToString("**-mm-ss"); string nowDate = DateTime.Now.ToString("dd-MM"); Код string screenshotName; string nowTime = DateTime.Now.ToString("**-mm-ss"); string nowDate = DateTime.Now.ToString("dd-MM"); Создаем метод, проверяющий наличие папки со скриншотами private void checkSrcDir() { if (!Directory.Exists("screenshots")) { Directory.CreateDirectory("screenshots"); } } Код private void checkSrcDir() { if (!Directory.Exists("screenshots")) { Directory.CreateDirectory("screenshots"); } } При клике на кнопку вешаем событие: private void doScreenShot_Click(object sender, EventArgs e) { Process proc = Process.GetProcessesByName("myProc").First(); // получаем наш процесс if (SetForegroundWindow(proc.MainWindowHandle)) { RECT srcRect; if (!proc.MainWindowHandle.Equals(IntPtr.Zero)) { if (GetWindowRect(proc.MainWindowHandle, out srcRect)) { int width = srcRect.Right - srcRect.Left; int height = srcRect.Bottom - srcRect.Top; Bitmap bmp = new Bitmap(width, height); Graphics screenG = Graphics.FromImage(bmp); try { screenG.CopyFromScreen(srcRect.Left, srcRect.Top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy); nowTime = DateTime.Now.ToString("**-mm-ss"); nowDate = DateTime.Now.ToString("dd-MM"); screenshotName = "screen_" + nowTime + "_" + nowDate + ".jpg"; // изменяем название скриншота checkSrcDir(); // проверяем папку со скриншотами bmp.Save("screenshots\\" + screenshotName, ImageFormat.Jpeg); // сохраняем скриншот HttpRequest req = new HttpRequest(); req.UserAgent = Http.ChromeUserAgent(); req.Referer = "http://yandex.ru"; var multipartContent = new xNet.MultipartContent() { {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName} }; string response = req.Post("http://site.ru/upload.php", multipartContent).ToString(); MessageBox.Show(response); // для отладки } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { screenG.Dispose(); bmp.Dispose(); } } } } } Код private void doScreenShot_Click(object sender, EventArgs e) { Process proc = Process.GetProcessesByName("myProc").First(); // получаем наш процесс if (SetForegroundWindow(proc.MainWindowHandle)) { RECT srcRect; if (!proc.MainWindowHandle.Equals(IntPtr.Zero)) { if (GetWindowRect(proc.MainWindowHandle, out srcRect)) { int width = srcRect.Right - srcRect.Left; int height = srcRect.Bottom - srcRect.Top; Bitmap bmp = new Bitmap(width, height); Graphics screenG = Graphics.FromImage(bmp); try { screenG.CopyFromScreen(srcRect.Left, srcRect.Top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy); nowTime = DateTime.Now.ToString("**-mm-ss"); nowDate = DateTime.Now.ToString("dd-MM"); screenshotName = "screen_" + nowTime + "_" + nowDate + ".jpg"; // изменяем название скриншота checkSrcDir(); // проверяем папку со скриншотами bmp.Save("screenshots\\" + screenshotName, ImageFormat.Jpeg); // сохраняем скриншот HttpRequest req = new HttpRequest(); req.UserAgent = Http.ChromeUserAgent(); req.Referer = "http://yandex.ru"; var multipartContent = new xNet.MultipartContent() { {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName} }; string response = req.Post("http://site.ru/upload.php", multipartContent).ToString(); MessageBox.Show(response); // для отладки } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { screenG.Dispose(); bmp.Dispose(); } } } } } myProc - замените на название процесса вашей программы (без .exe) Разберем вот эту строчку: var multipartContent = new xNet.MultipartContent() { {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName} }; Код var multipartContent = new xNet.MultipartContent() { {new FileContent("screenshots\\"+screenshotName), "upload", screenshotName} }; "screenshots\\"+screenshotName - путь до скриншота на вашем компьютере upload - название массива для php обработки ($_FILES['upload'][]) screenshotName - название файла, которое будет передано пхп скрипту. site.ru/upload.php - замените на путь до вашего скрипта. Далее переходим к пхп: $filename = md5(time()); move_uploaded_file ($_FILES['upload']['tmp_name'], 'screenshots/'.$filename.'.jpg'); echo 'http://site.ru/screenshots/'.$filename; // для показа юзеру, куда сохранился скриншот Код $filename = md5(time()); move_uploaded_file ($_FILES['upload']['tmp_name'], 'screenshots/'.$filename.'.jpg'); echo 'http://site.ru/screenshots/'.$filename; // для показа юзеру, куда сохранился скриншот Данный код будет загружать скриншот в папку screenshots под названием $filename (случайная мд5 строка). Не забудьте сделать проверки на наличие файла и mime тип файла. P.S. для отладки можете выводить массивы $_FILES и $_POST : echo '<br>files array:<br>'; print_r($_FILES); echo '<br>post array:<br>'; print_r($_POST); Код echo '<br>files array:<br>'; print_r($_FILES); echo '<br>post array:<br>'; print_r($_POST);
Вариант через обычный WebClient WebClient webClient = new WebClient(); webClient.Encoding = System.Text.Encoding.GetEncoding("UTF-8"); var responseBytes = webClient.UploadFile("http://site.ru/image.php", "screenshots\\"+screenshotName); string response = System.Text.Encoding.UTF8.GetString(responseBytes); Clipboard.SetText(response); Код WebClient webClient = new WebClient(); webClient.Encoding = System.Text.Encoding.GetEncoding("UTF-8"); var responseBytes = webClient.UploadFile("http://site.ru/image.php", "screenshots\\"+screenshotName); string response = System.Text.Encoding.UTF8.GetString(responseBytes); Clipboard.SetText(response);
А можно по другому с загрузкой на imgur using (var w = new WebClient()) { var values = new System.Collections.Specialized.NameValueCollection { { "image", Convert.ToBase64String(File.ReadAllBytes("путь до файла скриншота")) } }; w.Headers.Add("Authorization", "Client-ID *клиент ид получаем на https://api.imgur.com/oauth2/addclient выбирая 3-ю галочку*"); byte[] response = w.UploadValues("https://api.imgur.com/3/upload.xml", values); System.Xml.Linq.XDocument xDocument = System.Xml.Linq.XDocument.Load(new MemoryStream(response)); Clipboard.SetText(Convert.ToString(xDocument.Root.Element("link")).Replace("<link>", "").Replace("</link>", "")); // здесь немного говнокода MessageBox.Show("Прямая ссылка на скриншот сохранена в буффер обмена"); } Код using (var w = new WebClient()) { var values = new System.Collections.Specialized.NameValueCollection { { "image", Convert.ToBase64String(File.ReadAllBytes("путь до файла скриншота")) } }; w.Headers.Add("Authorization", "Client-ID *клиент ид получаем на https://api.imgur.com/oauth2/addclient выбирая 3-ю галочку*"); byte[] response = w.UploadValues("https://api.imgur.com/3/upload.xml", values); System.Xml.Linq.XDocument xDocument = System.Xml.Linq.XDocument.Load(new MemoryStream(response)); Clipboard.SetText(Convert.ToString(xDocument.Root.Element("link")).Replace("<link>", "").Replace("</link>", "")); // здесь немного говнокода MessageBox.Show("Прямая ссылка на скриншот сохранена в буффер обмена"); }
Я бы предложил такой вариант, он немного проще и короче Bitmap bmp = new Bitmap(this.Width, this.Height); Graphics graphics = Graphics.FromImage(bmp); graphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, new Size(this.Width, this.Height), CopyPixelOperation.SourceCopy); Directory.CreateDirectory("Screenshots"); string screenname = $"Screenshots\\{DateTime.Now.ToString("yyyy.MM.dd_HH-mm-ss")}.jpg"; bmp.Save(screenname, ImageFormat.Jpeg); //Ну а дальше выгрузка файла screenname (по желанию) Код Bitmap bmp = new Bitmap(this.Width, this.Height); Graphics graphics = Graphics.FromImage(bmp); graphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, new Size(this.Width, this.Height), CopyPixelOperation.SourceCopy); Directory.CreateDirectory("Screenshots"); string screenname = $"Screenshots\\{DateTime.Now.ToString("yyyy.MM.dd_HH-mm-ss")}.jpg"; bmp.Save(screenname, ImageFormat.Jpeg); //Ну а дальше выгрузка файла screenname (по желанию)