Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Syötteiden lähetys & ruudun lukeminen

Sivun loppuun

Macro [27.02.2010 15:06:32]

#

Heippa

Olen aika aloittelia vielä Basic maailmassa, mutta minusta syntaksi on helppo ymmärtää, joten se ei välttämättä ole kaamean hankala kieli. Vertailin itsekseni vaihtoehtoja, että lähdenkö toteuttamaan tätä C++:lla vai jollain Basicilla. C++ menee, mutta syntaksi oksettaa. Basic-kielien syntaksi taas on hauska, joten mitäs siinä sitten vertailemaan.

Itse asiaan... En ole ehtinyt perehtyä, mutta VB2008 kelvannee ruudun lukemiseen (Tarkoituksena poimia värejä tietyistä kohdista) ja näppäimistön ja hiiren käsittelyyn?

Ohjelman olisi aluksi tarkoitus pystyä kirjoittamaan avoinna olevaan tekstitiedostoon. Esimerkiksi, jos ruudullani on Notepad-ohjelma aukinaisena, niin ohjelma näppäimistöä painellen kirjoittaisi tekstiä. Onnistuuko tämmöinen?

Värien pominnalla ylempänä tarkoitin, että jos esimerkiksi kohdassa (500, 500) on #FF0000-väri, niin tehdään jotakin, kuten painetaan näppäimistöstä näppäintä tai poistutaan ohjelmasta.

Metabolix [27.02.2010 15:24:40]

#

En tiedä VB.NETistä, mutta jos helppoa ratkaisua haet, niin Javassa on näppärä Robot-luokka, jolla voi näppäillä ja liikutella hiirtä ja ottaa kuvakaappauksen suorastaan naurettavan helposti. Harvassa kielessä käsittelyä on tehty näin yksinkertaiseksi.

Macro [27.02.2010 15:26:40]

#

Näyttää tosiaan ihan naurettavan helpolta, kun katselee noita funktioita. Javan syntaksi on aika pitkälti sama kuin C++, joten se ei ole minun lempikieliäni. Tietenkin, jos pärjään pelkästään näillä, niin voin toki tätäkin koittaa. Javan kanssa minulla on aina ollut ongelmana se, että miten se ajetaan. Kerran törmäsin Java-oppaaseen, mutta ei siitä mitään tullut kun ohjelmia ei saatu ajettua.

Voiko Javalla painaa montaa näppäimistön nappulaa samaan aikaan? Entä, onnistuuko näppäintä pitää pohjassa esimerkiksi 500 millisekuntia?

Metabolix [27.02.2010 21:55:37]

#

Macro kirjoitti:

Voiko Javalla painaa montaa näppäimistön nappulaa samaan aikaan? Entä, onnistuuko näppäintä pitää pohjassa esimerkiksi 500 millisekuntia?

Kyllä, Robot-luokassa on erikseen metodit näppäimen painamiselle ja nostamiselle sekä odottamiselle.

Java-koodi täytyy kääntää Java-kääntäjällä (javac OmaOhjelma.java), minkä jälkeen se ajetaan Java-virtuaalikoneessa (java OmaOhjelma). Tarvittavat työkalut ovat JDK-paketissa (Java Development Kit). Kehitysympäristö on myös käytännöllinen; Sun itse suosittelee NetBeans-ympäristöä. Alkuun pääset helpoiten tästä, ja kattava opas itse kielestä on tässä.

En toki sano, etteikö VB.NET pystyisi tavalla tai toisella samaan, enkä myöskään väitä sitä huonoksi kieleksi, mutta jos aikoo enemmänkin harrastaa ohjelmointia, C:n tyyppiseen syntaksiin kannattaa totutella: lukuisat hyvin merkittävät kielet käyttävät sitä.

Jos kuitenkin haluat vaihtoehtoja, niin voithan käyttää esimerkiksi Jythonia, joka on Javalla toteutettu Python ja tukee suoraan Java-luokkien käyttöä. :)

Macro [28.02.2010 11:56:15]

#

No, Javaa sitten koitan tähän. Jos luon projektin NetBeans IDE:stä, niin minkälaiseksi projektiksi laitan tämän?

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class RobotExp {
    public static void main(String[] args) {
        try {
            Robot robot = new Robot();
            robot.delay(5000);
            robot.keyPress(KeyEvent.VK_H);
            robot.keyPress(KeyEvent.VK_I);
            robot.keyPress(KeyEvent.VK_SPACE);
            robot.keyPress(KeyEvent.VK_B);
            robot.keyPress(KeyEvent.VK_U);
            robot.keyPress(KeyEvent.VK_D);
            robot.keyPress(KeyEvent.VK_Y);

        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
}

Jos tämä pitäisi kirjoittaa päällimmäisenä olevaan ohjelmaan (Esimerkiksi Notepad), niin miten se tapahtuu? Nyt kyllä otsikko ja alue ovat väärät. Ohjelmointiputkaan pitäisi kirjoittaa Java-opas.

Metabolix [28.02.2010 13:03:03]

#

Jokainen näppäin pitää myös nostaa ylös, nyt vasta painat ne alas.

Ohjelman tuottama syöte vastaa aivan käyttäjän toimintaa. Helpoin tapa tietyn ikkunan käsittelyyn on avata ja valita ikkuna käsin, mikä rehellisissä tarkoituksissa minusta riittää varsin hyvin.

Kokeile jotain tällaista:

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class MacroRobo {
	public static void main(String[] args) {
		try {
			Robot robot = new Robot();
			// Viisi sekuntia aikaa valita ikkuna.
			robot.delay(5000);

			// Jos ohjelma on kranttu liian nopean syötteen suhteen,
			// voisi pitää automaattisesti pienen tauon joka välissä.
			// robot.setAutoDelay(10);

			// Shift + m = M
			robot.keyPress(KeyEvent.VK_SHIFT);
			robot.keyPress(KeyEvent.VK_M);
			robot.keyRelease(KeyEvent.VK_M);
			robot.keyRelease(KeyEvent.VK_SHIFT);

			// o
			robot.keyPress(KeyEvent.VK_O);
			robot.keyRelease(KeyEvent.VK_O);

			// i
			robot.keyPress(KeyEvent.VK_I);
			robot.keyRelease(KeyEvent.VK_I);
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}
}
[/koodic]

Tässä on koodin "tulostus", kun ohjelman käynnistämisen jälkeen valitsin tämän tekstialueen:
[koodi]
Moi

Macro kirjoitti:

Ohjelmointiputkaan pitäisi kirjoittaa Java-opas.

Laitetaan muistilistalle... Mutta mitä mieltä olit tuosta NetBeans-pikastartista? Luuletko, että "kuka tahansa" pääsisi sillä alkuun?

Macro [28.02.2010 13:56:43]

#

En luule, vaan uskon että jokainen pääsee sillä alkuun - jos vain haluaa Javaa opiskella. Kiitos esimerkistä, katsotaampas sitten.

Macro [28.02.2010 17:51:03]

#

Ideana on seuraava:

If KeyHit(F1) Then
	While Not KeyHit(F2)
		Kohta1 = GetPixel(x, y)
		Kohta2 = GetPixel(x, y)
		Kohta3 = GetPixel(x, y)
		Kohta4 = GetPixel(x, y)
		Kohta5 = GetPixel(x, y)

		If Kohta1 == FF0000 Then
			PressKey A
		Else If Kohta2 == FF00FF Then
			PressKey S
		Else If Kohta3 == FFFF00 Then
			PressKey D
		Else If Kohta4 == FFFFFF Then
			PressKey F
		Else If Kohta5 == 000000 Then
			PressKey G
		Else
			Do Nothing

		KeyRelease(All)

		Wait(10)
Else
	Print "Paina F1 aloittaaksesi tarkistuksen"

Eli, tarkistetaan 10ms. välein, onko tietyssä kohdassa jokin väri (x ja y merkinnät ovat joka kohdassa eri). Saako tälläisen toteutettua helposti? En saanut Metabolixin esimerkkiä toimimaan, saan virheitä vain.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta