Pages

Monday, February 21, 2011

Java multi-monitor screenshots

Random snippets I might want again one day ;)

Create a "C:\\CanDelete" directory before running any of this, or change the path building.

Take a screenshot of each monitor individually:
package com.blogspot.whileonefork.screencapture;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;


public class EachMonitor {
 public static void main(String[] argv) throws Exception {
  //Take a screenshot of every monitor
  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice[] screens = ge.getScreenDevices();
  
  for (GraphicsDevice screen : screens) {
   Robot robotForScreen = new Robot(screen);
   Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
   
   //The screen bounds have an annoying tendency to have an offset x/y; we want (0,0) => (width, height)
   screenBounds.x = 0;
   screenBounds.y = 0;
   BufferedImage screenShot = robotForScreen.createScreenCapture(screenBounds);
   String ext = "jpg";
   String outputFile = "C:\\CanDelete\\screenshot_" 
    + screen.getIDstring().replaceAll("[^A-Za-z0-9]", "_")
    + "."
    + ext;   
   ImageIO.write(screenShot, ext, new File(outputFile));
   System.out.println("Saved " + outputFile 
    + " of " + screen.getIDstring() 
    + " xy=(" + screenBounds.x + "," + screenBounds.y + ")"
    + " bounds=("+ screenBounds.width + "," + screenBounds.height + ")");
  }
 }
}


Take a single big screenshot of all monitors:

package com.blogspot.whileonefork.screencapture;

import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class AllMonitors {
 public static void main(String[] argv) throws Exception {      
  /**
   * Take one big screenshot of the entire UI. 
   * On my Windows box monitors seem to act like they are side by side on X, extending on Y.
   * Seems, at least on windows, to ignore any offset config setup in display properties.
   */
  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice[] screens = ge.getScreenDevices();
  
  Rectangle allScreenBounds = new Rectangle();
  for (GraphicsDevice screen : screens) {
   Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
   
   allScreenBounds.width += screenBounds.width;
   allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height);      
  }
  
  Robot robot = new Robot();
  BufferedImage screenShot = robot.createScreenCapture(allScreenBounds);
  
  String ext = "jpg";
  String outputFile = "C:\\CanDelete\\AllMonitors" 
   + "."
   + ext;   
  ImageIO.write(screenShot, ext, new File(outputFile));
  System.out.println("Saved " + outputFile 
   + " of all monitors " 
   + " xy=(" + allScreenBounds.x + "," + allScreenBounds.y + ")"
   + " bounds=("+ allScreenBounds.width + "," + allScreenBounds.height + ")");  
 } 
}


All this has been tested exactly once on a Windows box with two monitors of substantially different size; ymmv :)

103 comments:

  1. This seems to give errors when the first monitor is lower than the following monitors. If anyone else runs into this problem a corrected version can be found below. Also note that this version does not save a file, and instead returns a buffered image.


    package book;

    import java.awt.AWTException;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class AllMonitors {

    public BufferedImage getScreenshot() {

    //get handle to graphics environment
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] screens = ge.getScreenDevices();

    //if screens are detected proceed
    if (screens.length > 0) {

    try {
    //get the first screen
    GraphicsDevice a = screens[0];

    //get the monitor resolution
    Toolkit t = Toolkit.getDefaultToolkit();
    Rectangle allScreenBounds = new Rectangle(t.getScreenSize());

    //offset screen capture (in cases where first monitor is not the
    //highest this will come into effect)
    allScreenBounds.y = -1 * screens[0].getDefaultConfiguration().getBounds().y;

    //take screenshot
    Robot robot = new Robot();
    BufferedImage screenShot = robot.createScreenCapture(allScreenBounds);

    return screenShot;
    } catch (AWTException ex) {
    Logger.getLogger(AllMonitors.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    //if no screens detected return null
    return null;
    }
    }

    ReplyDelete
  2. The code to compute the virtual screen bounds can be found in the jdk's javadoc (http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/GraphicsConfiguration.html):

    Rectangle virtualBounds = new Rectangle();
    GraphicsEnvironment ge = GraphicsEnvironment.
    getLocalGraphicsEnvironment();
    GraphicsDevice[] gs =
    ge.getScreenDevices();
    for (int j = 0; j < gs.length; j++) {
    GraphicsDevice gd = gs[j];
    GraphicsConfiguration[] gc =
    gd.getConfigurations();
    for (int i=0; i < gc.length; i++) {
    virtualBounds =
    virtualBounds.union(gc[i].getBounds());
    }
    }

    ReplyDelete
  3. Thanks for this post, but especially +1000 to Dustin. If I had hair, I would have pulled it all out over this bug. Your comment saved me a lot of aggravation.

    ReplyDelete
  4. add this to the end of the for loop and it will work with as many monitors as you have ::: allScreenBounds.x=Math.min(allScreenBounds.x, screenBounds.x);
    allScreenBounds.y=Math.min(allScreenBounds.y, screenBounds.y);

    ReplyDelete
  5. add this to the end of the for loop and it will work with as many monitors as you have ::: allScreenBounds.x=Math.min(allScreenBounds.x, screenBounds.x);
    allScreenBounds.y=Math.min(allScreenBounds.y, screenBounds.y);

    ReplyDelete
  6. Thanks for sharing the info, keep up the good work going.... I really enjoyed exploring your site. good resource...best modem router combo

    ReplyDelete
  7. I appreciate that you produced this wonderful article to help us get more knowledge about this topic. I know, it is not an easy task to write such a big article in one day, I've tried that and I've failed. But, here you are, trying the big task and finishing it off and getting good comments and ratings. That is one hell of a job done!

    Data Science course in Chennai
    Data science course in bangalore
    Data science course in pune
    Data science online course
    Data Science Interview questions and answers
    Data Science Tutorial

    ReplyDelete
  8. Nice tutorial. Thanks for sharing the valuable information. it’s really helpful. Who want to learn this blog most helpful. Keep sharing on updated tutorials…
    Best Devops Training in pune
    Devops Training in Bangalore
    Microsoft azure training in Bangalore
    Power bi training in Chennai

    ReplyDelete
  9. Thanks for Sharing Such an useful & Informative Stuff...

    data science tutorial

    ReplyDelete

  10. I finally found great post here.I will get back here. I just added your blog to my bookmark sites. thanks.Quality posts is the crucial to invite the visitors to visit the web page, that's what this web page is providing.
    data analytics courses
    ExcelR Data Science training in Mumbai
    data science interview questions
    ExcelR Business Analytics courses in Mumbai

    ReplyDelete
  11. Thanks for sharing the info, keep up the good work going....You may have to try get clash of magic apk

    ReplyDelete

  12. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more.

    digital marketing courses mumbai

    ReplyDelete
  13. This article contains some of the most informative content I've read in quite some time. The points of this content are clear-cut and engaging. I think much like this writer.
    SAP training in Kolkata
    Best SAP training in Kolkata
    SAP training institute in Kolkata

    ReplyDelete
  14. Much obliged for this post, yet particularly +1000 to Dustin. In the event that I had hair, I would have hauled everything out over this bug. Your remark spared me a great deal of disturbance....
    rooftop snipers

    ReplyDelete
  15. Having read this I believed it was really informative. I appreciate you taking the time and effort to put this informative article together. I once again find myself spending a lot of time both reading and posting comments. But so what, it was still worth it!

    Buy Instagram Likes $1

    ReplyDelete
  16. I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well..
    data scientist training and placement in hyderabad

    ReplyDelete
  17. Thank you for sharing this information; keep up the good work.... I had a great time looking at your website. a useful resource..
    VAPOR VM

    ReplyDelete
  18. This is an excellent tutorial. Thank you for sharing such useful information. It's quite beneficial. This site is very useful for those who want to learn. Continue to share updated tutorials.....
    linkedin vaporvm

    ReplyDelete
  19. Thank you quite much for discussing this type of helpful informative article. Will certainly stored and reevaluate your Website.

    AWS Training in Hyderabad

    ReplyDelete
  20. Wow. That is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious. Thanks for Sharing This Article. It is very so much valuable content. Digital marketing training

    ReplyDelete
  21. Very nice blogs!!! i have to learning for lot of information for this sites…Sharing for wonderful information. Thanks for sharing this valuable information to our vision. You have posted a trust worthy blog keep sharing Digital marketing

    ReplyDelete
  22. very well explained. I would like to thank you for the efforts you had made for writing this awesome article. This article inspired me to read more. Keep it up. Digital marketing training Mumbai

    ReplyDelete
  23. Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging. digital marketing course Mumbai

    ReplyDelete
  24. We are really grateful for your blog post. You will find a lot of approaches after visiting your post. Great work
    full stack web development course in malaysia

    ReplyDelete
  25. 360DigiTMG, the top-rated organisation among the most prestigious industries around the world, is an educational destination for those looking to pursue their dreams around the globe. The company is changing careers of many people through constant improvement, 360DigiTMG provides an outstanding learning experience and distinguishes itself from the pack. 360DigiTMG is a prominent global presence by offering world-class training. Its main office is in India and subsidiaries across Malaysia, USA, East Asia, Australia, Uk, Netherlands, and the Middle East.

    ReplyDelete
  26. I really loved reading your blog. It was very well authored and easy to understand. Unlike other blogs I have read which are really not that good.Thanks alot! data science training in mysore

    ReplyDelete
  27. I have read your article; it is very informative and helpful for me. I admire the valuable information you offer in your articles. Thanks for posting it. data science course in surat

    ReplyDelete
  28. It become an attractive part of a blog when author uses indirect speech while writing a blog. It shows your creative mind as well as make your written essay different from others.
    devops training in bangalore
    devops course in bangalore
    aws training in bangalore

    ReplyDelete
  29. The author provides clear and concise Java code snippets for capturing screenshots of multiple monitors. These snippets are well-documented and helpful for anyone working on similar tasks.
    Is iim skills fake?

    ReplyDelete
  30. The author offers succinct and understandable Java code samples for taking screenshots on several monitors. For anyone working on related jobs, these snippets are beneficial and well-documented.
    Data Analytics Courses in Agra

    ReplyDelete
  31. This is a wonderfully intriguing post. I've been seeking this type of information and found it enjoyable to read. Please continue to publish. Thanks for sharing.
    daa Analytics courses in leeds

    ReplyDelete
  32. Great piece! I appreciate you sharing this valuable information. Please continue to do so.
    Great piece! I appreciate you sharing this valuable information. Please continue to do so.

    ReplyDelete
  33. The blog post provides valuable insights and collection of Java snippets for capturing screenshots across multiple monitors. thanks for sharing valuable blog.
    Digital Marketing Courses in Italy

    ReplyDelete
  34. Great code snippets! Your detailed comments make it easy to understand and implement. Thanks for sharing this useful Java multi-monitor screenshot solution.

    How Digital marketing is changing business

    ReplyDelete
  35. The blog post provides great tutorial on Java multi-monitor screenshots.
    Investment banking training Programs

    ReplyDelete
  36. Java's class allows developers to programmatically capture screen content, providing flexibility for applications that operate on multiple monitors. This feature proves beneficial in scenarios where precise monitoring, visual validation, or documentation of multi-monitor setups is essential. nice article.
    Data analytics framework

    ReplyDelete
  37. Wonderful idea and some really useful code as well. Thanks for sharing.
    Investment banking analyst jobs

    ReplyDelete
  38. Great article on capturing screenshots across multiple monitors in Java! This can be a tricky task, and I appreciate how you broke down the process for handling different screen configurations. The code examples are especially helpful for understanding how to capture and stitch together screenshots from different monitors. It would be interesting to see some tips on optimizing performance when working with high-resolution displays or how to handle various screen aspect ratios. Thanks for sharing this valuable resource!

    Digital Marketing Course In Hyderabad

    ReplyDelete
  39. Fantastic guide on capturing multi-monitor screenshots in Java! Your clear instructions and practical tips will surely help many developers streamline their workflow. Keep sharing your expertise; it’s inspiring to see how you tackle such niche topics!
    Data Science Courses in Singapore

    ReplyDelete
  40. thanks for sharing good technical content on Java
    helpful for real time coders
    data analytics courses in Singapore

    ReplyDelete
  41. "Great article! I love how you explained the process of taking multi-monitor screenshots in Java. The tips and code snippets are really helpful for anyone looking to implement this feature. Thanks for sharing!"

    Digital Marketing Course In Hyderabad

    ReplyDelete
  42. This is a fantastic resource for anyone looking to capture screenshots across multiple monitors using Java! I love how you’ve provided both individual and combined screenshot methods, which offers flexibility depending on user needs. Data science courses in Mysore

    ReplyDelete
  43. I have gone through your blog. It was really informative and helpful for monitoring the screenshot.
    Thank you for sharing.
    Data science Courses in Germany

    ReplyDelete
  44. This blog provides a useful guide on capturing screenshots across multiple monitors in Java. A great resource for developers working with multi-monitor setups and screenshot automation!
    Data science course in Gurgaon

    ReplyDelete
  45. Great post! I’ve always struggled with capturing screenshots across multiple monitors in Java, but your explanation makes it so much clearer.keep sharing and brings unique content. thank you
    Data science course in Bangalore

    ReplyDelete
  46. Wow, this post is fantastic! It’s so hard to find a straightforward way to capture screenshots across multiple monitors in Java. This solution is simple yet effective. Definitely bookmarking this for future reference. Thanks for the helpful tips!
    Data science courses in chennai

    ReplyDelete
  47. Great post! The method you’ve shared for taking screenshots across multiple monitors in Java is really useful. It’s a great technique for developers working with multi-screen setups. Thanks for sharing this practical solution, and I look forward to more posts like this!

    Data science courses in Bangladesh

    ReplyDelete
  48. This is a fantastic and practical guide for capturing screenshots across multiple monitors. digital marketing courses in delhi

    ReplyDelete
  49. Great work, i really appreciate this. Thanks for sharing
    Medical Coding Course

    ReplyDelete
  50. Thanks for sharing this informative post on Java multi-monitor screen support! Your code examples nd explanations are clear and concise!
    Medical Coding Courses in Chennai

    ReplyDelete
  51. This Blog is incredibly enlightening and thought-provoking. I really really appreciate the detailed insights you shared. Thank you for your valuable contribution! If you're interested in exploring robust cloud solutions and hosting services and I highly recommend checking out One Up Networks. They offer a variety of specialized services to cater to different business needs.
    Thanks for sharing your expertise! For more resources, please visit : -

    OneUp Networks
    CPA Hosting
    QuickBooks Hosting
    QuickBooks Enterprise Hosting
    Sage Hosting
    Wolters Kluwer Hosting
    Thomson Reuters Hosting
    Thomson Reuters UltraTax CS Cloud Hosting
    Fishbowl App Inventory Cloud Hosting
    Cybersecurity

    ReplyDelete
  52. This blog gives snippets of Java multi-monitor screenshots
    Random snippets.
    Medical Coding Courses in Bangalore

    ReplyDelete
  53. This post provides Java snippets for taking screenshots of multiple monitors, either individually or as one combined image. A helpful resource.
    Medical coding courses in Delhi/

    ReplyDelete
  54. "The Digital Marketing course at IIM SKILLS is perfect for anyone wanting to break into the digital marketing industry. The material is easy to understand and very practical."

    Medical Coding Courses in Coimbatore

    ReplyDelete
  55. I can see how these tips will help me move forward in my career.
    Medical Coding Courses in Chennai

    ReplyDelete
  56. Your blog is always full of valuable information! I always leave with new insights and things to think about. Lately, I’ve been researching medical coding as a career and found a Medical Coding Course in Delhi that looks interesting.
    Medical Coding Courses in Delhi

    ReplyDelete
  57. Your take on this issue is so refreshing. It’s exactly what I needed to hear today!" Medical Coding Courses in Delhi</a

    ReplyDelete
  58. Thanks for sharing the info, keep up the good work going....You may have to try get clash of magic
    https://iimskills.com/medical-coding-courses-in-hyderabad/

    ReplyDelete
  59. You did a great job breaking this down step by step. It really made a difference.
    Medical Coding Courses in Bangalore

    ReplyDelete
  60. Great post! The method you’ve shared for taking screenshots across multiple monitors in Java is really useful. It’s a great technique for developers working with multi-screen setups. Thanks for sharing this practical solution, and I look forward to more posts like this!
    https://iimskills.com/medical-coding-courses-in-bangalore/

    ReplyDelete
  61. I learn new things from your article. https://iimskills.com/data-science-courses-in-india/

    ReplyDelete
  62. Thanks for sharing the valuable information. it’s really helpful.
    Data Science Courses in India

    ReplyDelete
  63. Found it better than other institutes I researched.

    Medical Coding Courses in Delhi

    ReplyDelete
  64. This is fantastic! I've been looking for a clean way to handle multi-monitor screenshots in Java. The approach you've outlined looks really promising. Thanks for sharing this valuable information!
    Data Science Courses in India

    ReplyDelete
  65. Capturing multi-monitor screenshots in Java involves accessing all connected screen devices using the GraphicsEnvironment and GraphicsDevice classes. By iterating through each screen and using Robot.createScreenCapture(), developers can grab full or partial screenshots across displays. This technique is ideal for monitoring apps or multi-screen UI testing in Java environments.
    Data Science Courses in India

    ReplyDelete
  66. Great post! Your solution for capturing screenshots across multiple monitors in Java is really helpful. Multi-monitor setups can be tricky to handle programmatically, and your clear explanation and code example make it much easier to implement. Thanks for sharing your insights — this saved me a lot of time!
    Medical Coding Courses in Delhi

    ReplyDelete
  67. Thanks for sharing the info, keep up the good work going....You may have to try get clash of magic
    Medical Coding Courses in Delhi

    ReplyDelete
  68. Nice code example! Taking screenshots of each monitor separately is really helpful for multi-monitor setups. Thanks for sharing!
    Medical Coding Courses in Delhi

    ReplyDelete
  69. Great tips on capturing multi-monitor screenshots in Java!
    Medical Coding Courses in Kochi

    ReplyDelete
  70. This is a super handy snippet—exactly the kind of thing that saves hours down the line when dealing with multi-monitor setups. Tested it on a triple-monitor setup—worked like a charm with just minor tweaks. Medical Coding Courses in Kochi

    ReplyDelete
  71. Great work, i really appreciate this. Thanks for sharing.
    Medical Coding Courses in Delhi

    ReplyDelete
  72. Great work, i really appreciate this. Great post!
    Medical Coding Courses in Delhi

    ReplyDelete
  73. Great utility code for multi-monitor setups in Java! Especially useful for debugging or automated UI captures—thanks for sharing!

    Medical Coding Courses in Delhi

    ReplyDelete
  74. Great snippets for anyone working with multi-monitor setups in Java! The approach to capture each monitor individually and the combined virtual screen shot is very practical. Also appreciate the fix for handling monitors arranged with different vertical positions — that’s a common real-world challenge. Thanks for sharing this handy code!
    Medical Coding Courses in Delhi

    ReplyDelete
  75. Great post! Capturing screenshots across multiple monitors in Java isn’t as straightforward as it seems, so it’s great to see it broken down clearly.
    Medical Coding Courses in Delhi

    ReplyDelete
  76. This is super handy for anyone managing screenshots across multiple monitors in Java! If you're looking to apply programming in healthcare tech, check out these Medical Coding Courses in Delhi.

    ReplyDelete
  77. Great tutorial! Capturing screenshots across multiple monitors with Java can be tricky, but your explanation makes it straightforward. Thanks for sharing these practical tips!
    Medical Coding Courses in Delhi

    ReplyDelete
  78. Excelente exemplo prático! O uso da classe Robot para capturar capturas de tela em sistemas com múltiplos monitores é uma abordagem eficaz. A implementação apresentada permite capturar a tela de cada monitor individualmente ou uma captura abrangente de todos os monitores, ajustando-se dinamicamente às configurações de tela. Para aqueles interessados em aprender de forma estruturada sobre captura de tela e automação de testes, este recurso pode ser útil:
    Medical Coding Courses in Delhi

    ReplyDelete
  79. This post offers useful Java code examples for capturing screenshots on multi-monitor setups, explaining how to capture each screen separately or combine them into one large image. It also discusses practical challenges like coordinate offsets across monitors. A helpful resource for developers working with multi-display screen capture. Do check out Medical Coding Courses in Delhi for more career opportunities.

    ReplyDelete
  80. Your tutorial on capturing screenshots across multi-monitor setups in Java is so niche yet incredibly useful! The code examples and attention to screen-geometry details make it feel doable, not daunting. Kudos for making a cluttered challenge clear and cool.

    financial modeling courses in delhi

    ReplyDelete
  81. financial modeling courses in delhi
    Excellent post! Capturing screenshots across multiple monitors in Java isn’t always straightforward, and your explanation of using GraphicsEnvironment and GraphicsDevice was spot-on. It’s great to see practical code examples that handle screen boundaries and resolutions correctly.

    I especially appreciated the tips on stitching images and managing performance—super helpful for anyone building monitoring or automation tools.

    Would love to see a follow-up on handling dynamic monitor changes or integrating with JavaFX. Thanks for sharing such a useful and well-explained solution!

    ReplyDelete
  82. You've created a knowledge catalyst! Accelerating understanding exponentially.
    Medical Coding Courses in Delhi

    ReplyDelete
  83. Thanks for sharing these Java snippets for multi-monitor screenshots
    https://iimskills.com/financial-modelling-course-in-delhi/

    ReplyDelete
  84. Your post on Java multi‑monitor screenshots is both insightful and technically helpful. The code examples you provided—one for capturing individual monitor screenshots and another for grabbing a unified image across all screens—are well‑commented and easy to follow. I especially appreciated your note about coordinate offsets; it’s a real-world nuance that many overlook. These code snippets will definitely assist developers working with complex multi‑display environments. This post is a great combination of practical coding and thoughtful explanation.
    financial modelling courses in delhi

    ReplyDelete
  85. This tutorial provides a clear and practical approach to capturing screenshots across multiple monitors in Java. The use of the GraphicsEnvironment and Robot classes allows for efficient screen capturing. A valuable resource for developers working with multi-monitor setups.
    Steemit
    +3
    whileonefork.blogspot.com
    +3
    Baeldung on Kotlin
    +3
    Apriorit
    +1
    financial modeling courses in delhi

    ReplyDelete
  86. Great post! The method you’ve shared for taking screenshots across multiple monitors in Java is really useful.
    financial modeling courses in delhi

    ReplyDelete
  87. Really useful post! Capturing screenshots across multiple monitors in Java can be tricky, and your clear explanation with code examples helps simplify this task. This will definitely help developers dealing with multi-display setups.
    financial modeling courses in delhi

    ReplyDelete
  88. This is a really practical guide for taking multi-monitor screenshots in Java! I like how you provide both individual monitor captures and a single combined screenshot—super useful for developers working with complex setups. The code is clear and easy to follow, making it great for learning and quick implementation.
    financial modeling courses in delhi

    ReplyDelete
  89. This guide gives a clear way to capture multi-monitor screenshots in Java. I like that it shows both single-screen output and one full combined image, which helps developers working with large setups. The sample code stays simple and easy to follow, making it useful for quick testing and real projects.
    financial modeling courses in delhi

    ReplyDelete