Kirjoittaja: Sami
Kirjoitettu: 03.05.2004 – 15.12.2011
Tagit: kirjaston käyttö, koodi näytille, vinkki
Ohjelma näyttää kuinka javalla voi kirjoittaa mitä vain ja minne vain käyttämällä luokkaa java.awt.Robot. Esimerkki avaa notepadin, kirjoittaa siihen 200 merkkiä ja sen jälkeen sulkee notepadin muutoksia tallentamatta. Toiminta edellyttää sitä, että käyttäjä antaa notepadin olla päällä loppuun asti eikä vaihda ikkunaa kesken kaiken. Jos vaihtaa ikkunaa, niin ohjelma alkaa kirjoittamaan siihen ja lopussa saattaa jopa sulkea sen, vaikka tarkoituksena olikin sulkea vain notepad. :)
Write.java
import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import java.io.IOException; public class Write { //Robot-olio syötteiden (näppäimistöpainallusten) antamiseksi tietokoneelle static Robot robot; public static void main(String[] args) { //Luodaan Robot-olio try { robot = new Robot(); } catch(AWTException e) { } //Avataan notepad kirjoittamista varten try { Runtime.getRuntime().exec("notepad"); } catch (IOException e) { } //Odotetaan vähän ennen kuin pistetään notepad sauhuamaan... System.out.println("Beginning to write in 1 second..."); try { Thread.sleep(1000); } catch(InterruptedException e) { } //Kirjoitetaan 200 satunnaista merkkiä write(200, 100); //Kirjoittamisen jälkeen suljetaan notepad closeNotepad(); } public static void write(int length, int averageWaitingTime) { int prevKey = 9; for (int i = 0; i < length; i++) { //Arvotaan mitä laitetaan seuraavaksi int nextKey = (int)(Math.random() * 50) ; //Kirjoitetaan merkki/merkkejä robot.KeyPress:in avulla //Tekstistä ei saa mitään selvää, muttei toisaalta ole tarkoituskaan... if (nextKey <= 6 && prevKey > 9) { // 6/50 tapauksessa kirjoitetaan välilyönti robot.keyPress(KeyEvent.VK_SPACE); } else if(nextKey <= 7 && prevKey > 9) { // 1/50 tapauksessa kirjoitetaan pilkku ja välilyönti robot.keyPress(KeyEvent.VK_COMMA); robot.keyPress(KeyEvent.VK_SPACE); } else if(nextKey <= 8 && prevKey > 9) { // 1/50 tapauksessa kirjoitetaan piste ja välilyönti robot.keyPress(KeyEvent.VK_PERIOD); robot.keyPress(KeyEvent.VK_SPACE); } else if(nextKey <= 9 && prevKey > 9) { // 1/50 tapauksessa kirjoitetaan piste ja rivinvaihto robot.keyPress(KeyEvent.VK_PERIOD); robot.keyPress(KeyEvent.VK_ENTER); } else { // 41/50 tapauksessa kirjoitetaan jokin satunnainen kirjain //Kirjoitetaan isolla jos se on "lauseen" ensimmäinen if (prevKey == 8 || prevKey == 9) { robot.keyPress(KeyEvent.VK_SHIFT); } //Kirjaimien kirjainkoodit ovat väliltä 65 - 80 robot.keyPress((int)(Math.random() * 26) + 65); robot.keyRelease(KeyEvent.VK_SHIFT); } prevKey = nextKey; //Odotetaan hieman ennen kuin kirjoitetaan seuraava merkki robot.delay((int)(Math.random() * 2 * averageWaitingTime)); } } public static void closeNotepad() { //Ensin odotetaan 2 sekuntia robot.delay(2000); //...painetaan ALT pohjaan robot.keyPress(KeyEvent.VK_ALT); //...painetaan F4 robot.keyPress(KeyEvent.VK_F4); //...vapautetaan ALT robot.keyRelease(KeyEvent.VK_ALT); //...odotetaan taas hieman robot.delay(500); //...Painetaan TABia, jotta ei vastattaisi kyllä kysymykseen "haluatko tallentaa muutokset" robot.keyPress(KeyEvent.VK_TAB); //...odotetaan taas hieman robot.delay(300); //...Painetaan ENTER ei-vaihtoehdon kohdalla robot.keyPress(KeyEvent.VK_ENTER); } }
Oliskohan missään esimerkkiä? (kuulostaa hauskalta ohjelmalta)
Erinomainen esimerkki, en tiennytkään moisesta luokasta.
Lisäinfona voisin sanoa, että Robot-luokka siis toimii tavallaan ajastettuna toimintona tai osuvaakin osuvammin robottina. Viiveet on millisekunteina.
Jos ei satu olemaan java-kääntäjää, niin valmiiksi käännetty luokka on osoitteessa http://www.paivola.net/~sami/java/Write.class
Luultavasti kaikilla on sentään java runtime asennettuna kunnolla, eli ohjelman saa käyntiin kirjoittamalla komentoriville "java Write" (ilman lainausmerkkejä, ja kirjainkoolla on väliä. Muista myös oikea kansio :)
Hieno esimerkki paljon apua=)
Mutta tietääkö joku saako odotettu niin kauan, että jokin toiminto suoritetaan loppuu esim excel makro ennen kuin jatketaa näppäin yhdistelmien syöttämistä?
Onko mahdollista saada toimimaan, jos koneen alusta ei tue matalan tason syötteenhallintaa(esim. jollain laajennuksella)?