Как определить, на каком экране я щелкнул приложение в панели задач Windows? - PullRequest
1 голос
/ 14 октября 2019

Я занимаюсь разработкой 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, выглядя так:

enter image description here

Но проблема в том, что независимо от того, с какого дисплея [он отображается на каждом дисплее] Я щелкнул по нему, мое приложение всегда запускается [открывается] на центральном [основном] дисплее, поэтому мой вопросявляется: есть ли способ, которым я могу запустить это приложение на дисплее, на котором я щелкнул, и что оно может определить, с какого монитора оно работает?

Я думал о чем-то вроде: 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(); } });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...