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!
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.
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..
Du schiebst einfach die Fenster auf die entsprechenden Monitore. Da braucht man kein Programm zur Steuerung. Die meisten Programme merken sich, wo sie liefen.
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
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.
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.
packageinfo.junius.test;importjava.awt.Desktop;importjava.awt.GraphicsConfiguration;importjava.awt.GraphicsDevice;importjava.awt.GraphicsEnvironment;importjava.awt.Rectangle;importjava.io.File;importjava.io.IOException;importjava.net.URI;importjava.net.URISyntaxException;importjavax.swing.JFrame;importjavax.swing.JLabel;publicclassDesktopScreens{publicstaticvoidmain(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;}}}privatestaticvoidplaceFramesOn(GraphicsDevice device,int p){GraphicsConfiguration[] gc = device.getConfigurations();for(int i =0; i < gc.length;++i){System.out.println(gc[i]);JFrame frame =newJFrame(device.getDefaultConfiguration());JLabel label =newJLabel(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(newURI("http://example.com"));Thread.sleep(5000);}catch(IOException|URISyntaxException|InterruptedException e){
e.printStackTrace();}}if(p ==1){try{Desktop.getDesktop().edit(newFile("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!
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?
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?
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.