Я занимаюсь разработкой Java-приложения, которое будет делать снимок экрана, у меня в офисе 3 монитора, поэтому я хочу, чтобы мое приложение могло делать снимок экрана с интересующим меня дисплеем. сделать сейчас, чтобы сделать снимок экрана каждого экрана и сохранить 3 файла. Но я не хочу получать 3 файла каждый раз, когда запускаю свое Java-приложение. Поэтому я хочу знать, есть ли способ определить, с какого экрана запущено мое Java-приложение, и сделать только снимок экрана этого экрана, но мой вопрос не получил ответа: Как определить, на каком мониторе мое Java-приложение
Я подумал о создании ярлыка файла jar моего Java-приложения на рабочем столе, а затем установил цель его свойства следующим образом: "C: \ Program Files \ AdoptOpenJDK \ jdk-8.0.222.10-hotspot\ bin \ javaw.exe "-jar C: \ Dir_Screen_Shoter \ dist \ Screen_Shoter.jar
Затем я прикрепил ярлык к панели задач Windows, выглядя так:
Но проблема в том, что независимо от того, с какого дисплея [он отображается на каждом дисплее] Я щелкнул по нему, мое приложение всегда запускается [открывается] на центральном [основном] дисплее, поэтому мой вопросявляется: есть ли способ, которым я могу запустить это приложение на дисплее, на котором я щелкнул, и что оно может определить, с какого монитора оно работает?
Я думал о чем-то вроде: shift-click, alt-click илиудерживая Ctrl, затем нажмите наприложение на панели инструментов, но оно не будет обнаруживать все это, так что это хорошее решение, поэтому, когда я запускаю приложение, оно будет знать, какой дисплей сделать снимок экрана, легко, если мое приложение откроет окно и позволит пользователювыберите, на каком мониторе действовать, но я не хочу этого, я просто хочу, чтобы он делал снимок экрана, не открывая окно приложения.
Я нашел несколько связанных вопросов, но ни один из них не отвечает на мой вопрос:
Показать JFrame на определенном экране в конфигурации с двумя мониторами
Как определить текущий дисплей с Java?
[Я пробовал это, но он всегда показывает идентификатор устройства == 1]
Мое приложение выглядит так:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Screen_Shoter extends JPanel
{
static Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
static JFrame frame=new JFrame("Screen_Shoter");
static int W=screenSize.width,H=screenSize.height;
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String Result="Screen_Size : "+W+" x "+H+"\n",Dir_Screenshots="C:/Dir_Screenshots/",Screen_Shot_File_Name=Dir_Screenshots+format.format(new Date()).replace("-","_").replace(" ","_").replace(":","_")+"_.png";
JLabel infoLabel=new JLabel();
public Screen_Shoter() // Get ScreenShots From Multiple Monitors
{
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gDevs=ge.getScreenDevices();
if (!new File(Dir_Screenshots).exists()) new File(Dir_Screenshots).mkdirs();
int defaultScreenIndex=getScreenIndex();
Out("defaultScreenIndex = "+defaultScreenIndex+"\n");
for (GraphicsDevice gDev : gDevs)
{
DisplayMode mode=gDev.getDisplayMode();
Rectangle bounds=gDev.getDefaultConfiguration().getBounds();
Out("[ "+gDev.getIDstring()+" ] Min : ( "+bounds.getMinX()+" , "+bounds.getMinY()+" ) ; Max : ( "+bounds.getMaxX()+" , "+bounds.getMaxY()+" ) W = "+mode.getWidth()+" , H = "+mode.getHeight());
try
{
Robot robot=new Robot();
BufferedImage image=robot.createScreenCapture(new Rectangle((int)bounds.getMinX(),(int)bounds.getMinY(),(int)bounds.getWidth(),(int)bounds.getHeight()));
ImageIO.write(image,"png",new File(Screen_Shot_File_Name.replace(".png",gDev.getIDstring().replace("\\","")+".png")));
}
catch (AWTException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
}
infoLabel.setFont(new Font("Times New Roman",0,15));
infoLabel.setForeground(new Color(0,0,218));
infoLabel.setText("<html>"+Result.replace("\n","<P>")+"</html>");
add(infoLabel);
}
int getScreenIndex()
{
int myScreenIndex=-1;
GraphicsConfiguration config=frame.getGraphicsConfiguration();
GraphicsDevice myScreen=config.getDevice();
GraphicsEnvironment env=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] allScreens=env.getScreenDevices();
for (int i=0;i<allScreens.length;i++)
{
if (allScreens[i].equals(myScreen))
{
myScreenIndex=i;
break;
}
}
Out("frame : "+frame.getBounds());
return myScreenIndex;
}
private static void showOnScreen(int screen,Window frame)
{
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd=ge.getScreenDevices();
GraphicsDevice graphicsDevice;
if (screen>-1 && screen<gd.length) graphicsDevice=gd[screen];
else if (gd.length>0) graphicsDevice=gd[0];
else throw new RuntimeException("No Screens Found");
Rectangle bounds=graphicsDevice.getDefaultConfiguration().getBounds();
int screenWidth=graphicsDevice.getDisplayMode().getWidth();
int screenHeight=graphicsDevice.getDisplayMode().getHeight();
frame.setLocation(bounds.x+(screenWidth-frame.getPreferredSize().width)/2,bounds.y+(screenHeight-frame.getPreferredSize().height)/2);
// frame.setLocation(bounds.x,bounds.y);
frame.setVisible(true);
}
private void out(String message)
{
System.out.print(message);
Result+=message;
}
private void Out(String message)
{
System.out.println(message);
Result+=message+"\n";
}
// Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread.
static void createAndShowGUI()
{
final Screen_Shoter demo=new Screen_Shoter();
frame.add(demo);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setBounds(0,0,600,178);
frame.setLocationRelativeTo(null);
frame.setVisible(true); // For test only
// showOnScreen(0,frame);
}
public static void main(String[] args)
{
// Schedule a job for the event-dispatching thread : creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } });
}
}