# Fremdes Anwenungsfenster steuern



## ARadauer (9. Juni 2008)

Hallo,
ich suche eine Möglichkeit auf einem Win Xp System, mit der ich aus meiner Java Anwendung  auf andere Fenster zugreifen kann. Sprich ermitteln welche Fenster aktuell vorhanden sind, die Titel der Fenster und die Koordinaten.
Ein Fenster zu verschieben oder zu schließen, wär auch noch hilfreich, muss aber nicht unbingt sein, weil wenn ich die Koordinaten haben, kann ich das mit Robot auch selber machen.

Gibt es da Möglichkeiten ohne JNI? Bzw gibt es schon vorgefertigte DLL die ich über JNI einbinden kann?
Ich würd gerne den Kelch der C++ Programmierung, an mir vorüber gehen lassen....

Kann mir da jeman Tipps geben?

Danke


----------



## zeja (9. Juni 2008)

Du kannst auch JNA verwenden, dann mußt du kein JNI programmieren 

Ansonsten kannst du dir auch mal anschauen ob du über die SWT Funktionen eventuell über Reflection dort rankommst.


----------



## ARadauer (9. Juni 2008)

Ich habs jetzt mit JNA geschafft, war aber, finde ich, nicht sehr einfach....

ich habe jetzt zusätzlich zum jna.jar noch die samples eingebunden, dann gings leichter, da schon viele Dinge wie zb HWND vorhanden waren.. trotzdem sind in den Beispieldatein auch noch nicht alle Methoden die man in der MSDN findet drinnen...., hab dann nochmal ein Interface erstellt dass von User32 erbt.

hier mein Beispiel:


```
package at.pb.main;

import com.sun.jna.Native;
import com.sun.jna.examples.win32.User32;

public interface User32B extends User32{
	
	User32B INSTANCE = (User32B) Native.loadLibrary("user32", User32B.class, DEFAULT_OPTIONS);
	
	boolean IsWindowVisible(HWND hWnd);

}
```


```
package at.pb.main;

import com.sun.jna.Pointer;
import com.sun.jna.examples.win32.GDI32;
import com.sun.jna.examples.win32.GDI32.RECT;
import com.sun.jna.examples.win32.User32.WNDENUMPROC;
import com.sun.jna.examples.win32.W32API.HWND;

public class Test{
	
		
	public static void main(String[] args) {
		User32B user32 = User32B.INSTANCE;		
		user32.EnumWindows(new WNDENUMPROC() {
			int counter =0;
		   public boolean callback(HWND hwnd, Pointer arg1) {
			   counter++;
				User32B user32 = User32B.INSTANCE;
				if(user32.IsWindowVisible(hwnd)){
					System.out.println("Fenster: "+counter);
					byte[] name = new byte[512];
					user32.GetWindowText(hwnd, name, name.length);
					System.out.println(byte2String(name));
					RECT r  = new GDI32.RECT();

					user32.GetWindowRect(hwnd,r);
					System.out.println(r.toString());
				}			
		        return true;
			}
		}, null);
        
    }
	
	public static String byte2String(byte[] array) { 
	      char[] charray = new char[array.length/2]; 
	      int c=0;
	      for (int i=0;i<charray.length;i=i+2) 
	      { 
	        Byte bt = new Byte(array[i]); 
	        char ch = (char)bt.intValue();
	        if(ch==0){
	        	break;
	        }
	        charray[ c]=ch;
	        c++;
	      } 
	      String str = new String (charray);  
	    return str.substring(0, c);
	   } 
}
```

ist jetzt nur ein Beispiel, dass genau das macht was ich eigentlich vor hatte..
das byte array von den nativen Methoden hat mir auch noch Probleme bereitet.. gibts da eine bessere Lösung?


----------



## Thomas Darimont (10. Juni 2008)

Hallo,

cool, das gleiche hab ich eben auch versucht mit dem selben Ergebnis... (hab auch das User32 Interface aus den Examples gepatched ;-)
Ich hab mir die API aber von verschiedenen Delphi Lösungen abgeschaut:
http://www.swissdelphicenter.ch/en/showcode.php?id=485



> ist jetzt nur ein Beispiel, dass genau das macht was ich eigentlich vor hatte..
> das byte array von den nativen Methoden hat mir auch noch Probleme bereitet.. gibts da eine bessere Lösung?


... als ich da keine Lust mehr zu hatte, hab ichs so gemacht...

```
byte[] buffer = new byte[256];

                int len = user32.GetWindowText(hWnd, buffer, buffer.length);

                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < 2 * len; i += 2) {
                    stringBuilder.append((char) buffer[i]);
                }

                System.out.println(stringBuilder);
```
Das muss aber noch anders gehen, das wär ja sonst eine riesige Platzverschwendung...

Gruß Tom


----------



## altglass (8. Juli 2008)

Zum verwandeln des byte arrays zum String kannst du einfach den String Konstruktor verwenden.

```
String name_string = new String(name, "UTF-16LE").trim()
```


----------

