Liste offener Fenster

Carlo P.

Mitglied
Ich weiß leider nicht, ob das Thema in den Anfängerberreich gehört aber der ein oder andere kann mir sicher helfen ^^

Ist es möglich und wenn ja wie geht es, Informationen über die aktuell geöffneten Fenster zu bekommen? Genau geht es mir um den Titelstring und die Fensterpositionen auf dem Desktop.

Hab noch eine weitere frage die indirekt dazugehört: Kann man screenshots von den jeweiligen Fenstern bekommen, auch wenn sie überlappt sind (im schlimmsten Fall minimiert)? Hab das bisher immer mit nem vorher definiertem rectangle und der üblichen robot-funktion gemacht ... aber damit kann man natürlich keine überlappten Bereiche capturen.

Danke im Voraus, Carlo
 
Man kann sich mit Frame (Java Platform SE 6) zwar alle Frames holen, die von der gleichen Java-Application erstellt wurden, aber keine anderen. Das geht wohl nur mit JNI, und wäre da (und damit) eben höchst spezifisch für Windows, Linux & Co, und ggf. noch deren Unterarten. Auch Screenshots von "beliebigen" Fenstern ginge nur über die besagten Frames aus der gleichen Java-Anwendung. Für beliebige ScreenCaptures von irgendwelchen Fenstern bräuchte man auch wieder JNI.
 
ok, danke erstmal 😛

Das Stichwort JNI sieht auf den ersten Blick so aus, als könnte es mir weiterhelfen. Geht mir nämlich um Fenster die nicht von einer Java-Application stammen ... wie z.B. Browser oder ganz normal mit dem Explorer geöffnete Ordner.
Bin glücklicherweise vor kurzem wieder auf Windows XP als OS umgestiegen, was mir hierbei dann wohl zugutekommt. Allerdings sieht das Thema auch ziemlich kompliziert aus und scheint eng mit der Windows API usw. zusammenzuhängen, womit ich mich leider gar nicht auskenne :/
und da ich auch 'nur' eine Liste der Fensterinformationen haben will und mich gar nicht wirklich tief in die Thematik einarbeiten will, frag ich nochmals nach ein paar Tipps ^^
Hab auf die schnelle auch nichts hier/in andren Foren gefunden, was mich gewundert hat, weil ich mir vorstellen kann, dass man sowas doch öfters brauchen könnte ...

Bin dankbar für alle Arten von Links zu nützlichen Threads oder Homepages, die sich mit was ähnlichem beschäftigen.

EDIT: Dummes Problem bei der Suche ist natürlich noch die Tatsache, dass fenster auf englisch window heißt -.-
 
Zuletzt bearbeitet:
Hm - sorry, for konkreten code müßte ich auch erst suchen und basteln, aber wenn man nach sowas wie "window handle" OR hwnd java jni sucht, findet man schon ein paar Dinge, die in die richtige Richtung gehen.
JNI hat mit Windows bzw. der Windows API erstmal nichts zu tun: JNI ist nur das "Java Native Interface" mit dem man von Java aus z.B. ganz allgemein DLLs ansprechen kann (oder SOs unter Linux oder JNILIBs unter MacOS), und damit natürlich auch an die Windows Handles rankommt...
 
So, erstmal danke für die Antwort, hat mir auf jeden Fall bei der Suche geholfen.
Nach ein bisschen Lesen und Suchen bin ich auf Beispielcodes gestoßen, welche die JNA Bibliothek benutzen, um die nativen DLLs anzusprechen. Die funktionieren soweit einwandfrei:

Java:
import com.sun.jna.*;
import com.sun.jna.win32.*;

public class Main {

    public interface Kernel32 extends Library {
        public boolean Beep(int FREQUENCY, int DURATION);
        public void Sleep(int DURATION);
    }

    public static void main(String[] args) {
        Kernel32 kernel32lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        kernel32lib.Beep(698, 500);
    }

}

Die Bibliothek wird richtig geladen, die Funktion richtig ausgeführt und ich höre den sound wie es sein soll.

Ich hab dann auf msdn.microsoft.com/en-us/library/ms633497(VS.85).aspx geschaut, welche win32 Funktionen ich verwenden möchte und versucht sie nach dem Code von oben in mein Javaprogramm einzubinden.
Hab dann die entsprechende Bibliotheken geladen (In meinem Fall für alle die User32.dll) und versucht, die Funktionen einzubinden ... da ist mir zum ersten mal aufgefallen, dass die benötigten Argumente (teils auch Rückgabewerte) nicht mehr von einem Typ sind, der ein entsprechendes "Gegenüber" in Java hat (hWnd ist ein Beispiel, das hier oft auftaucht)

Davor hatte ich nur das hier gelesen:
https://jna.dev.java.net/javadoc/overview-summary.html#marshalling
Und leider hab ich keine hilfreichen Programmbeispiele gefunden, die andere Argumente brauchen. Nur noch mehrere mit SYSTEMTIME usw. die eben short-werte usw. brauchen (Open source Java projects: Java Native Access - JavaWorld)

Wäre nett, wenn mir jemand noch ein bisschen behilflich sein könnte. Hab da natürlich noch weiter gelesen, aber versteh das ganze mit functionmapping, callbacks, pointers usw. nich so ganz, bzw. weiß nicht was genau davon ich hierfür brauch.

Falls wer das gleiche Problem hat:
Bin während der Suche noch auf JWinAPI gestoßen. Die Bibliothek liefert direkt Funktionen, mit denen man z.B. fast direkt die Liste der Namen der laufenden Prozesse bekommt. Damit hätte ich mein Problem sicher auch lösen können, wollte mich aber nicht darauf verlassen, da es mit einer .exe kommt, die bevor man die Bibliothek benutzen kann eine eigene .dll in nen Systemordner kopiert ... Würde es gern mit denen hinbekommen, die es schon von Haus aus gibt.
 
Zuletzt bearbeitet:
Wer vertreibt denn ein Projekt auf sourceforge ausschließlich als setup.exe? Das source-Archiv kann ich jedenfalls gerade nicht aufmachen...

Ein HWND ist (wenn ich mich nicht sehr täusche) einfach ein durch etliche #typdef's umgebogener int - man würde also einen (Java) int verwenden.... Beispiele sollte man mit Websuche finden, z.B. In Java Swing how do you get a Win32 window handle (hwnd) reference to a window? - Stack Overflow wo man ein HWND (als int) bekommt, und dort wird auch schon ein bißchen mit den Fenstertiteln rumgedoktert... Ich müßte aber erst in die WinAPI-Dokus gucken, wie man sich die Titel (z.B. als String-Array) abholen kann...
 
Zu deinem Link: Das ist leider wieder mit JNI, wofür man einen in c geschriebenen Teil braucht und was auch allgemein komplizierter als JNA zu sein scheint. Es muss doch möglich sein, das ganze mit JNA hinzubekommen, nach dem Muster aus meinem vorherigen post. Ich bekomm jedes mal ein Fehler und komm nicht wirklich voran. Hier nochmal ein Teil code nur um zu zeigen wie genau ichs mein/haben will:

Java:
import com.sun.jna.*;
import com.sun.jna.win32.*;

public class Main {
    public interface Kernel32 extends Library {
        public boolean Beep(int FREQUENCY, int DURATION);
    }

    public interface User32 extends Library {
        public int FindWindow(String ClassName, String WindowName);
        public boolean AnyPopup();
    }

    public static void main(String[] args) {
        Kernel32 kernel32lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        kernel32lib.Beep(698, 500);
        User32 user32lib = (User32) Native.loadLibrary("user32", User32.class);
        System.out.println(user32lib.AnyPopup());
        System.out.println(user32lib.FindWindow(null, null));
    }    
}


Der sound aus der kernel32 funktion kommt, die AnyPopup funktion gibt auch was aus, aber bei der FindWindow kommt:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'FindWindow': Die angegebene Prozedur wurde nicht gefunden.
hatte noch andere Funktionen getestet, ein paar haben was geliefert, aber bei den meisten (wichtigen) kam derselbe Fehler.
Hab die Funktionen und deren Argumente alle aus der Auflistung hier:
msdn.microsoft.com/en-us/library/
Liegt das an falschen Argumenten (weil bei dem nicht funktionierendem hab ich jetzt statt hWnd int genommen) oder gibts die Funktionen in der user32.dll vielleicht nicht mehr oder ist der Grund was ganz anderes?


Wer vertreibt denn ein Projekt auf sourceforge ausschließlich als setup.exe? Das source-Archiv kann ich jedenfalls gerade nicht aufmachen...
Hab ich mich auch gefragt, weil ich mal reingucken wollte ... aber wird scheinbar von mehreren benutzt und hat bei mir auch gut funktioniert.
 
HWND <=> HANDLE <=> PVOID <=> void*
Nach einem kurzen Blick in die JNA-Doku müsstest du also com.sun.jna.Pointer verwenden.
 
Kommt dieselbe Meldung, des wird aktuell noch an was andrem liegen :/
Ich test grad mit den verschiedenen Funktionen aus der Liste rum, ob ich ein Zusammenhang von denen erkenn, die funktioneren (bzw. nicht funktionieren).
Aber danke für ->com.sun.jna.Pointer ... werd ich wohl spätestens brauchen, wenn ich die Funktionen richtig aufrufen kann.


EDIT: Funktioniert wohl doch nur bei einigen wenigen Funktionen nicht.
EnumWindows und GetWindowText funktionieren wie oben beschrieben wunderbar und des sind die wichtigsten. Danke nochmal an euch beide, ich markier mal als gelöst.

EDIT EDIT: FindWindowA funktioniert :lol: wirklcih vielen Dank
 
Zuletzt bearbeitet:
Wenn sich herausstellen sollte, dass alle Funktionen bei denen ein String als Parameter vorkommt nicht funktionieren, dann würde ich darauf tippen dass die unterschiedlichen Zeichenkodierungen dran schuld sind.

Ich hab in der JNA-Doku auch einen Typ WString explizit für Unicode-Strings gesehen. Außerdem meine ich, dass in den ganzen WinAPI-Headern abhängig von einem Makro UNICODE (weiß nicht obs auf FindWindow zutrifft) auf unterschiedliche Funktionen FindWindowA und FindWindowW weiterverwiesen wird. Vielleicht probierst du es ja mal mit denen.
 

Neue Themen


Zurück
Oben