Kirjautuminen

Haku

Tehtävät

Koodit: Java: Näppäinten simulointi

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);
	}
}

Kommentit

T.M. [06.05.2004 20:14:28]

#

Oliskohan missään esimerkkiä? (kuulostaa hauskalta ohjelmalta)

tsuriga [06.05.2004 21:11:36]

#

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.

Sami [07.05.2004 02:05:36]

#

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

Mikko1979 [24.08.2006 08:38:48]

#

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

jt263 [28.02.2010 11:22:01]

#

Onko mahdollista saada toimimaan, jos koneen alusta ei tue matalan tason syötteenhallintaa(esim. jollain laajennuksella)?

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta