Dane z innej aplikacji

0

Witam, czy jest możliwość odczytania danych z innej aplikacji i przeniesienia jej do swojej?
Pytam, ponieważ chciałbym stworzyć program rysujący mapę do gry Otchłań:
user image
Na podstawie podanych komend w grze (north, south, east, west - później być może jeszcze piętra - up,down) program ma w zamiarze rysować mapę. Niestety nie wiem w jaki sposób mógłbym pobrać te dane - czy gracz wpisał n,s,e lub w.

Jestem początkującym programistą jeśli chodzi o jave, a więc jestem otwarty na wszelką krytykę lub też pomoc :)
Oto co na razie udało mi się stworzyć.
Główna klasa:

package com.matixar.mapcreator;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

import com.matixar.mapcreator.Checker;

public class Main extends Canvas implements Runnable 
{
	private static final long serialVersionUID = 1L;
	
	public static int width = 480;
	public static int height = width / 4 * 3;
	
	public static String title = "Test";
	
	private Thread thread;
	private JFrame frame;
	private boolean running = false;
	
	public Main()
	{
		Dimension size = new Dimension(width, height);
		setPreferredSize(size);
		
		frame = new JFrame();
		Checker.check(frame);
	}
	
	
	
	public synchronized void start()
	{
		running = true;
		thread = new Thread(this,"Display");
		thread.start();
	}
	
	public synchronized void stop()
	{
		running = false;
		try
		{
			thread.join();
		}catch(InterruptedException e) {e.printStackTrace();}
	}
	
	public void run()
	{
		while(running)
		{
			
		}
	}
	
	public static void main(String[] args)
	{
		Main window = new Main();
		window.frame.setResizable(false);
		window.frame.setTitle(title);
		window.frame.add(window);
		window.frame.pack();
		window.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.frame.setLocationRelativeTo(null);
		window.frame.setVisible(true);
		
		window.start();
	}
}

 

Zrobiłem osobną klasę do sprawdzenia, czy gra jest uruchomiona:

 
package com.matixar.mapcreator;

import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Checker 
{
	
	public Checker()
	{
		
	}
	
	public static void check(JFrame frame)
	{
		while(true)
		{
			try
			{
				String line;
				String pidInfo = "";
			
				Process running =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
				BufferedReader runningInput =  new BufferedReader(new InputStreamReader(running.getInputStream()));

				while ((line = runningInput.readLine()) != null) 
				{
					pidInfo += line; 
				}

				runningInput.close();

				if(pidInfo.contains("otchlan.exe"))
				{
					JOptionPane.showMessageDialog(frame, "Otchłań uruchomiona!");
					break;
				}
			
				else
				{
					JOptionPane.showMessageDialog(frame, "Nie wykryto Otchłani!");

					Object[] options = {"Ok, już włączam!",
										"Wyłącz program"};
					int n = JOptionPane.showOptionDialog(frame,
							"Proszę najpierw włączyć Otchłań!",
							"Mały problem",
							JOptionPane.YES_NO_OPTION,
							JOptionPane.INFORMATION_MESSAGE,
							null,
							options, 
							options[0]);

					if(n == 1) System.exit(0);		
				}	
			}catch(IOException ep) {ep.printStackTrace();}
		}
	}

}

2

Ja bym zrobił odwrotnie, będzie dużo prościej. Tzn napisał aplikacje i te swoje komendy wpisujesz do niej, a ta twoja javowa aplikacja robi Runtime.exec() z tą grą a potem przez strumienie z uzyskanego obiektu Process po prostu przekazuje do gry wpisywane przez użytkownika komendy (i ewentualnie przepisuje to co gra wyświetla).

0
Shalom napisał(a):

Ja bym zrobił odwrotnie, będzie dużo prościej. Tzn napisał aplikacje i te swoje komendy wpisujesz do niej, a ta twoja javowa aplikacja robi Runtime.exec() z tą grą a potem przez strumienie z uzyskanego obiektu Process po prostu przekazuje do gry wpisywane przez użytkownika komendy (i ewentualnie przepisuje to co gra wyświetla).

W sumie nie myślałem nad takim rozwiązaniem, a wydaje się bardzo dobre - za co bardzo dziękuję :)

Ale czy mimo tego, jest jakaś metoda, dzięki której możemy uzyskać dane z jakiejś aplikacji?

0

Jasne i to nie jedna. Możesz na przykład debugować ten proces i czytać z jego pamięci. Albo go crackować i zmodyfikować binarkę tak żeby przy okazji wysłała ci jakieś informacje. Ale i jedno i drugie jest nieporównywalnie trudniejsze ;]

0

Poszperałem trochę o tym czytaniu pamięci i na zagranicznym forum znalazłem coś o bibliotece JNA, dzięki której w połączeniu z interfejsami User32 oraz Kernel32 można to zrobić, ale dalej no cóż... Wygląda jak hackowanie, dość skomplikowane :)
Nie chciałbym też zrobić prostego kopiuj-wklej tylko zrozumieć ten kod, a to mi raczej zajmie trochę czasu, ale mimo tej trudności wydaję się to warte nauki.
Więc póki ktoś mi nie podpowie prostszego sposobu lub sam go nie znajdę to chyba wybiorę tą Twoją opcję :P
Ewentualnie później, gdy będę mądrzejszy - przerobię program.

Jeśli ktoś ma jeszcze jakieś pomysły - z miłą chęcią przeczytam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1