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)?