# HDMI Ausgänge mit Java programmieren?



## jacknjonny (18. Mai 2017)

hallo liebe Menschen
Ich suche einen weg (für einen kompletten Anfänger) mit java ein Programm zu schreiben mit welches ich die Ausgänge des HDMI Signals festlegen/kontrollieren kann. Ist das möglich, sinnvoll, odr gar fehl am platz? Bin für jeden beitrag dankbar der mich weiter bringt!


----------



## mrBrown (18. Mai 2017)

Deine Frage ist etwas unverständlich, aber wahrscheinlich ist Java dafür die falsche Sprache...

Was soll "Ausgänge des HDMI Signals festlegen" bedeuten?


----------



## jacknjonny (18. Mai 2017)

Also danke erstmal für die rasche antwort, meine Allergie macht es für mich schwierig auf Schreibfehler odr sonstiges zuachten, 

Was ich damit meine ist eig ganz einfach gesagt:

HDMI 1 = spiel 1 auf monitor 1 
HDMI 2 = film 1 auf monitor 2 
HDMI 3 = liste1 (irgendwelche) auf monitor 3 
HDMI 4 = skype auf monitor 4 

Und das alles von einem Rechner aus. 
Welche sprache ist nötig ?


----------



## Tobse (18. Mai 2017)

Welches Betriebssystem denn?

Entweder kannst du das direkt im OS konfigurieren. Oder aber du musst dem OS mitteilen, welche Anwendung auf welchen Bildschirm soll. Ob das geht hängt aber stark vom OS ab und geht mit Java sicher nicht.


----------



## jacknjonny (18. Mai 2017)

Aber müsst doch theoretisch ein Programm geben mit dem man das steuern kann? Obs jetz im OS drin wär oder nicht? Ich denke mal ich arbeite mit einem windows, mac ist mir gerade zu kostspielig..


----------



## Dukel (18. Mai 2017)

Du schiebst einfach die Fenster auf die entsprechenden Monitore. Da braucht man kein Programm zur Steuerung. Die meisten Programme merken sich, wo sie liefen.


----------



## jacknjonny (18. Mai 2017)

Ich würde aber sehr gern eines schreiben welches die Parameter festlegt. Ich versteh eure Skepsis aber wenn ihr seht was ich vorhabe dann versteht ihr es


----------



## Dukel (18. Mai 2017)

Es kommt auf die Programme an. Wenn diese eine Funktion bieten das Programm von außen zu steuern, dann kannst du darauf zugreifen. Ich wüsste aber nicht das es etwas generisches gibt.


----------



## Tobse (18. Mai 2017)

Na dann musst du C-Code schreiben, der mit dem Windows Window-Manager redet und ihm sagt, welches Fenster auf welchen Schirm gehört. Ob das geht und wie die API calls sind kann ich dir nicht sagen, aber Java ist sicherlich die falsche Sprache dafür.


----------



## jacknjonny (18. Mai 2017)

Oke kennt sich jemand hier im forum damit aus? Und könnte das MIT (nicht für mich..) mir auf die beine stellen?


----------



## AndyJ (19. Mai 2017)

Howdy,
Ich habe mal ein bischen rumgespielt:


```
package info.junius.test;

import java.awt.Desktop;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class DesktopScreens {

 public static void main(String[] args) {
  GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
  if (!env.isHeadless()) {
   GraphicsDevice[] devices = env.getScreenDevices();
   int p = 0;
   for (GraphicsDevice gd : devices) {
    System.out.println(gd);
    System.out.println(gd.getIDstring());
    System.out.println(gd.getDisplayMode().getWidth() + "/" + gd.getDisplayMode().getHeight());
    
    placeFramesOn(gd, p);
    ++p;
   }
  }
 }
 
 private static void placeFramesOn(GraphicsDevice device, int p) {
  GraphicsConfiguration[] gc = device.getConfigurations();
  for (int i = 0; i < gc.length; ++i) {
   System.out.println(gc[i]);
   JFrame frame = new JFrame(device.getDefaultConfiguration());
   JLabel label = new JLabel(device.toString());
   Rectangle gcBounds = gc[i].getBounds();
   int xoffs = gcBounds.x;
   int yoffs = gcBounds.y;
   frame.getContentPane().add(label);
   frame.setLocation(i * 100 + xoffs, i*150 + yoffs);
   frame.setSize(200, 80);
   frame.setVisible(true);
   // die Idee: das Programmfenster geht da auf, wo der Frame den Focus hat
   // Problem: es funktioniert nicht
   // Anderer Ansatz: nutze die Process API to run shell script that does the job
   frame.requestFocusInWindow();
   if (p == 0) {
    try {
     Desktop.getDesktop().browse(new URI("http://example.com")); 
     Thread.sleep(5000);
    } catch (IOException | URISyntaxException | InterruptedException  e) { 
     e.printStackTrace();
    }
   }
   if (p == 1) {
    try {
     Desktop.getDesktop().edit(new File("test.txt"));
     Thread.sleep(5000);
    } catch (IOException | InterruptedException e) { 
     e.printStackTrace();
    }
   }
   
  }

 }
 

}
```

Ich hatte gedacht, die Fenster die man da oeffned waeren an den JFrame gebunden. Ist aber leider nicht der Fall. Nun koennte man stattdessen Batchfiles oder Shell-scripte schreiben, die die noetigen Parameter uebernehmen und dann die Programme oeffnen oder schon geoeffnete and den richtigen Platz verschieben. Es gibt scheinbar Tools, die das koennen aber da musst du selber suchen. Have fun!

Cheers,
Andreas


----------



## Tobse (19. Mai 2017)

@AndyJ Wieso in aller Welt sollten die Fenster von Skype oder einem Video-Player was mit den JFrames in einem anderen Prozess zu tun haben??


----------



## jacknjonny (19. Mai 2017)

​


----------



## jacknjonny (19. Mai 2017)

Danke andreas !
Obwohl ich nicht viel davon verstanden hab..
Abgesehn von den software Problemen hab ich ja auch nicht 4 hdmi Eingänge und würde das meine Grafikkarte überhaupt aushalten?


----------



## mrBrown (19. Mai 2017)

jacknjonny hat gesagt.:


> Abgesehn von den software Problemen hab ich ja auch nicht 4 hdmi Eingänge und würde das meine Grafikkarte überhaupt aushalten?


Kommt auf die Grafikkarte an, gibts durchaus welche, die das können.

Gibts unter Unixoiden mit virtuellen Desktops überhaupt eine Zuordnung von Programm zu realem Bildschirm?


----------



## jacknjonny (19. Mai 2017)

mrBrown hat gesagt.:


> Kommt auf die Grafikkarte an, gibts durchaus welche, die das können.
> 
> Gibts unter Unixoiden mit virtuellen Desktops überhaupt eine Zuordnung von Programm zu realem Bildschirm?



Wäre es schlauer vll 2 Grafikkarten zu verwenden um die eine nicht auszulasten?
Dann würde man vll auch keine Zuordnung zu realen Bildschirmen brauchen weil es dann "nur" 2 Bilder nebeneinander die auf 2 Bildschirme gezogen sind sein, oder wäre es schwierig einem unixoiden beizubringen viertuelle und reale Bildschirme zu verstehen und wahrzunehmen?


----------



## AndyJ (20. Mai 2017)

Tobse hat gesagt.:


> @AndyJ Wieso in aller Welt sollten die Fenster von Skype oder einem Video-Player was mit den JFrames in einem anderen Prozess zu tun haben??


Haben die nicht. Ich hab's einfach probiert - manchmal endeckt man dabei was Neues, manchmal nicht.


----------



## AndyJ (20. Mai 2017)

Es kann auch sein, dass dir das Betriebssystem nur einen grossen Bildschirm mit Riesenaufloesung vorgaukelt.


----------



## Neumi5694 (22. Mai 2017)

Also HDMI direkt ansteuern wirst du a) nicht hinkriegen und b) ist das der falsche Weg.
Je nach System kriegt die Anwendung gar nicht mit, welche Hardware im Hintergrund tuckert.
mrBrown liegt völlig richtig, im Normalfall kriegst du nur abstrahierte, virtuelle Desktops. Wohin die dann gehen ... das ist nicht dein Bier (kannst du natürlich abfragen).
Stell dir mal vor, du greifst mit Remotedesktop auf den PC zu. In dem Fall geht das Signal über gar keinen Display-Port, sondern wird über ein virtuelles Gerät über das Netzwerk geschickt.
Was die Grafikkarten angeht, da wirst du auch keinen direkten Zugriff kriegen.
Du kannst natürlich abfragen, was dir alles zur Verfügung steht und entsprechend anfordern, sofern möglich.
https://docs.oracle.com/javase/7/docs/api/java/awt/GraphicsEnvironment.html
https://docs.oracle.com/javase/7/docs/api/java/awt/GraphicsConfiguration.html

Bei allem gilt: Jeder der Einträge kann virtuell sein oder echte Hardware im Hintergrund haben, es gibt da für dich als Frontend-Programmierer keinen Unterschied.


----------

