# Position/Größe von Windows-Fenstern ermitteln



## ZaidoR (9. Jun 2010)

Hallo,

ich suche schon nach längerem nach einer "simplen" Lösung, wie ich aus bereits geöffneten Fenstern die Position und Größe ermitteln kann. Ein Beispiele wäre, ich habe Excel geöffnet und möchte nun dessen Position und Größe mittels Java erhalten.

Habe schon öfters Stichpunkte wie JNE oder User32 gelesen... Aber was ist nun das Korrekte und/oder vllt. das simpelste?? ???:L


(Hoffe dies ist das richtige Forum) 

Vielen Dank
Rene


----------



## Gastredner (9. Jun 2010)

Es gibt keine "simple" Lösung. Du musst über JNA auf die Windows-API zugreifen und dir die entsprechenden Werte zurückgeben lassen oder du musst eine JNI-Bibliothek schreiben und dort dann auf die Windows-API zugreifen.
Selbstverständlich würde das dann auch nur unter Windows laufen.

EDIT: Du nimmst eine Skriptsprache wie AutoIt - diese kann die gewünschten Informationen ermitteln. Damit schreibst du ein Skript/Programm, welches die gewünschten Werte ausließt und auf die Standardausgabe schreibst. Dieses Programm startest du dann aus Java heraus und ließt einfach mit, was es auf stdout ausgibt.
Ist dann aber auch irgendwie hässlich.


----------



## ZaidoR (9. Jun 2010)

hm ok, hab ich mir schon gedacht.. erstmal danke für die antwort..
hättest du vllt ein kleines beispielskript, wie man via JNA dieses realisiert?!
was man für dateien benötigt, was man tun muss.. am besten wäre ein beispielprogramm, welches ein bestimmtes programm analysiert, bzw dessen größe und position ermittelt und in der java console ausgibt oder so, dat wäre echt spitze!


----------



## Gastredner (9. Jun 2010)

ZaidoR hat gesagt.:


> hättest du vllt ein kleines beispielskript, wie man via JNA dieses realisiert?!


Ich habe bisher weder mit JNA, noch mit der Windows-API gearbeitet, von daher...nein, habe ich nicht.

Ein Teil des AutoIt-Quellcodes ist öffentlich, dort könntest du vielleicht nach den entsprechenden Funktionen und ihrer Umsetzung suchen. Ansonsten dürfte es ja wohl eine Beschreibung der Windows-API geben, die dir weiterhelfen könnte.


----------



## ZaidoR (9. Jun 2010)

hm, ich denke, dass sich irgendwer doch bestimmt mal mit diesem thema auseinander gesetzt hat. jeder hat ja mal klein angefangen. Und beispiel-quellcode finde ich auch nirgends ausführlich beschrieben, was schade ist.
nagut.. dann muss ich mich wohl selbst zurecht finden.
aaaber falls jemand ein beispielcode zur verfügung hat, dann bitte ich doch diesen hier zu posten,
wäre ich sehr dankbar für!


Grüße
Rene


----------



## Gastredner (9. Jun 2010)

ZaidoR hat gesagt.:


> hm, ich denke, dass sich irgendwer doch bestimmt mal mit diesem thema auseinander gesetzt hat.


Sicherlich - aber eher weniger im Java-Umfeld.


----------



## kay73 (9. Jun 2010)

Hi, die JNA hat mappings für die USER32.DLL. Leider gibt es für GetWindowTextLength und GetWindowText unsatisfiedLinkErrors bei mir (XP SP3 im vmplayer), aber vielleicht klappts es bei Dir. Du brauchst diese beiden JARs im Klasssenpfad:
jna.jar
platform.jar

```
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.GDI32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.W32API;
import com.sun.jna.platform.win32.GDI32.RECT;


public class WindowPosApp {

	public static void main(String[] args) {
		final User32 user32 = (User32) Native.loadLibrary("user32", User32.class); 
				
		user32.EnumWindows(new User32.WNDENUMPROC() {
			
			@Override
			public boolean callback(W32API.HWND hwnd, Pointer arg1) {
				final GDI32.RECT r = new RECT();
				user32.GetWindowRect(hwnd, r);
								
				int titleLength = user32.GetWindowTextLength(hwnd);
				
				final byte [] title = new byte [titleLength];
				user32.GetWindowText(hwnd, title, title.length);
				
				System.out.println(String.format("%1$80s: [%2$d,%3$d][%4$d,%5$d]", 
					new String(title), 
					r.left, r.top, r.right - r.left, r.bottom - r.top));
				
				return true;
			}
		}, null);
	}
}
```


----------



## ZaidoR (9. Jun 2010)

das sieht doch schonmal nach was aus.. ich werds bald ausprobieren.
danke für deine mühe!


----------



## ZaidoR (9. Jun 2010)

also bei mir kommt leider die selbe fehlermeldung :-(
(gibts dazu auch ne doku?)


----------



## kay73 (10. Jun 2010)

ZaidoR hat gesagt.:


> (gibts dazu auch ne doku?)


Ja, die gibt es auf der Homepage. Das Problem liegt aber wahrscheinlich eher am Export der Funktionen in den verschiedenen Windows Versionen. GetWindowRect funktioniert z. B. wie erwartet.


----------



## ZaidoR (11. Jun 2010)

wie meinst du das? aber irgendwie muss das doch funktionieren...


----------



## kay73 (11. Jun 2010)

Hi, sorry, der Code stimmte so nicht. Man kann/muss 
	
	
	
	





```
User32.INSTANCE
```
 direkt verwenden. Die Library bekam so wohl eine Option zum Mappen von Funktionsnamen für Win32 nicht mit. Hier gibt es ein paar Sonderzeichen am Ende bei den Widechar-Fenstertiteln, aber ansonsten gehts. Bei den ASCII-Versionen crasht die JVM, aber die benutzt man eh nicht.
	
	
	
	





```
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.GDI32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.W32API;
import com.sun.jna.platform.win32.GDI32.RECT;

public class WindowPosApp {

	public static void main(String[] args) {
		User32.INSTANCE.EnumWindows(new User32.WNDENUMPROC() {
			
			@Override
			public boolean callback(W32API.HWND hwnd, Pointer arg1) {
				final GDI32.RECT r = new RECT();
				User32.INSTANCE.GetWindowRect(hwnd, r);
								
				int titleLength = User32.INSTANCE.GetWindowTextLength(hwnd);
				
				final char [] title = new char [titleLength+2];
				User32.INSTANCE.GetWindowText(hwnd, title, title.length);
								
				System.out.println(String.format("%1$s: [%2$d,%3$d][%4$d,%5$d]", 
					new String(title), 
					r.left, r.top, r.right - r.left, r.bottom - r.top));
				
				return true;
			}
		}, null);
	}
}
```
.

Wieso sind die "Ändern" Knöpfe alle weg???


----------



## ZaidoR (12. Jun 2010)

cool, danke 
das sieht doch schonmal nach einem ergebnis aus!

Ist nur komisch mit den leeren chars am ende jedes fenstertitels, aber das kann man ja parsen...


So und was ich jetzt nur noch benötige, ist von einem Fenster alle Unterfenster, sprich EnumChildWindows oder sowas?!?!
Wenn du sowas auch noch hinbekommst, wäre das super!


ABER SCHONMAL DICKES LOB!!


----------

