Name des aktuellen Programms

grafsoft

Mitglied
Ich fange Tastatureingaben ab und würde gerne wissen, in was für einem Programm (Anwendung, app ...) der Benutzer gerade ist, z.B. Word, Notepad ...

Was ich bekomme sind sich ständig ändernde Werte wie z.B. "[C@2b40eb52".

Ich habe gesucht und nicht gefunden.

Mein Code:

Java:
public String getActiveWindowText() {
            User32 OS = (User32) User32.INSTANCE;
            HWND h = OS.GetForegroundWindow();
            int length = OS.GetWindowTextLength(h);
            char[] buffer = new char[512];
            OS.GetWindowText(h, buffer, length + 1);
            String s = buffer.toString();
            return (s);
        }
 

KonradN

Super-Moderator
Mitarbeiter
Das ist halt das, was bei einem Char Array heraus kommt. Auf Arrays toString() aufzurufen ergibt die typische Ausgabe von Object. Streng genommen haben Arrays eine kleine Sonderrolle, aber der Typ wird da dann mit einem "[" + einem Kürzel des Typs (hier C für char) angegeben.

Wenn Du aus einem char Array ein String machen willst, dann solltest Du einmal die Klasse String ansehen. Da dürftest Du dann einen Konstruktor und eine valueOf Methode finden.

Und du musst Dir die Dokumentation genauer ansehen" GetWindowText gibt die Anzahl der Zeichen zurück. Das musst Du natürlich mit verwenden, denn Du willst da ja nicht den ganzen Buffer nutzen!
 

grafsoft

Mitglied
Das ist halt das, was bei einem Char Array heraus kommt. Auf Arrays toString() aufzurufen ergibt die typische Ausgabe von Object. Streng genommen haben Arrays eine kleine Sonderrolle, aber der Typ wird da dann mit einem "[" + einem Kürzel des Typs (hier C für char) angegeben.

Wenn Du aus einem char Array ein String machen willst, dann solltest Du einmal die Klasse String ansehen. Da dürftest Du dann einen Konstruktor und eine valueOf Methode finden.

Und du musst Dir die Dokumentation genauer ansehen" GetWindowText gibt die Anzahl der Zeichen zurück. Das musst Du natürlich mit verwenden, denn Du willst da ja nicht den ganzen Buffer nutzen!
Danke, wieder was gelernt! Auch Beispiele bei Stackoverflow u.a. können Fehler enthalten.
 

KonradN

Super-Moderator
Mitarbeiter
Nur um es noch einmal etwas genauer zu machen:

Wenn man sich die JNA Dinge anschaut, dann macht es Sinn:
a) die Größe des Buffers zuerst abzufragen
b) dann Native.toString() zu nutzen, denn das Encoding muss nicht dem in Java entsprechen und so.

Der Code sieht dann so aus:
Java:
  final int requiredLength = User32.INSTANCE.GetWindowTextLength(hwnd) + 1;
  final char[] title = new char[requiredLength];
  final int length = User32.INSTANCE.[URL='https://www.tabnine.com/code/java/methods/com.sun.jna.platform.win32.User32/GetWindowText']GetWindowText[/URL](hwnd, title, title.length);
  return Native.toString(Arrays.copyOfRange(title, 0, length));
 

Robert Zenz

Top Contributor
Das Beispiel scheint grundasetzlich ein biszchen komisch zu sein wenn man sich die Dokumentation ansieht.

Korrekter wird es in etwa so sein:

Java:
User32 user32 = (User32) User32.INSTANCE;

HWND foregroundWindowHandle = user32.GetForegroundWindow();

char[] foregroundWindowTextBuffer = new char[512];

int foregroundWindowTextLength = user32.GetWindowText(
        foregroundWindowHandle,
        foregroundWindowTextBuffer,
        foregroundWindowTextBuffer.length);
        
String foregroundWindowText = new String(
        foregroundWindowTextBuffer,
        0,
        foregroundWindowTextLength);

return foregroundWindowText;

@KonradN Die Groesze des Buffers vorher abzufragen ist eine gute Idee, aber dann hast du da eine Race-Condition falls sich der Fenstertitel in der Zwischenzeit aendert. Mit einem fixen (zu groszen) Buffer bekommst du immer den ganzen (vorrausgesetzt der ist nicht zu lange, ja).
 

KonradN

Super-Moderator
Mitarbeiter
@KonradN Die Groesze des Buffers vorher abzufragen ist eine gute Idee, aber dann hast du da eine Race-Condition falls sich der Fenstertitel in der Zwischenzeit aendert. Mit einem fixen (zu groszen) Buffer bekommst du immer den ganzen (vorrausgesetzt der ist nicht zu lange, ja).
Das Risiko ist natürlich da. Aber hier muss man keine Angst haben, dass dies zu einem Overflow führt. Der eigentliche Aufruf, der da statt findet, dürfte
GetWindowTextA function (winuser.h) - Win32 apps | Microsoft Learn
sein. (Evtl. gibt es auch eine Ex Variante oder so. Ich habe da jetzt nicht mehr im Detail hinein geschaut.)

Aber es wird klar, wie hier die API aufgebaut wurde von Microsoft: Es wird nicht nur ein Buffer übergeben sondern auch die Größe des Buffers.

Wenn man das als Problem ansieht, dann sollte man ggf. hin gehen und überlegen, ob man mehr Tests macht. Man könnte also z.B. die Länge abfragen, dann einen Buffer mit +2 Größe erstellen (Also einmal für das 0-Byte und dann ein Reserve Byte) und dann prüfen, ob die Länge die zurück gegeben wurde kleiner oder gleich der abgefragten Länge ist.

Die andere Alternative wäre, dass man halt für eine Länge x Platz reserviert und nur Längen < x akzeptiert. Wenn als Länge x Zurück kommt, dann wird der Buffer (x) verdoppelt. Dann würde man auch immer den ganzen Titel bekommen. Sprich: Man nimmt die 512 char, wenn nicht weniger als 511 Zeichen zurück kommen, dann nimmt man 1024 Zeichen und erwartet weniger als 1023 Zeichen ... u.s.w.

Aber ich denke, damit schießt man mit Kanonen auf Spatzen. Dein Hinweis ist aber auf jeden Fall gerechtfertigt und wichtig!
 

Robert Zenz

Top Contributor
Das Risiko ist natürlich da. Aber hier muss man keine Angst haben, dass dies zu einem Overflow führt.

Nein nein, ich dachte da wirklich nur an die "Gefahr" das man einen gekuerzten Titel bekommt beziehungsweise nicht den ganzen Titel bekommt (weil er in der Zwischenzeit laenger geworden ist). Deswegen fixe Buffergroesze damit man da nicht hineinlaufen kann oder zumindest weisz dass man Titel mit Groesze X oder groszer nicht bekommen wird). Der Ueberlauf sollte ja von der API her gar nicht auftreten (oder man bekommt -1 zurueck, oder so, was aber in dem Fall nicht der Fall ist).
 

KonradN

Super-Moderator
Mitarbeiter
Ja, mir war klar, dass dies dein Hauptanliegen war, aber ich dachte, dass andere da ggf. eine größere Angst haben. Buffer Overflow und so wird der eine oder Andere ja gehört haben und da kommen ggf. Ängste auf. Daher meine Ausführung. Hätte ich evtl. deutlicher schreiben müssen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Ist ein string ein erlaubter variabel name? Allgemeine Java-Themen 2
S Variable als Objekt Name Allgemeine Java-Themen 3
J Apache POI - No external workbook with name Allgemeine Java-Themen 5
Neumi5694 Task-Name unter Windows Allgemeine Java-Themen 4
1 Name Generator für Videos Allgemeine Java-Themen 1
E Webservice zur Konvertierung IBAN/BIC -> Bank Name Allgemeine Java-Themen 1
P Name der Parent Klasse abfragen Allgemeine Java-Themen 8
D Name eines Nicht-String Objekts ausgeben Allgemeine Java-Themen 4
S Name einer Musikdatei auslesen und ändern Allgemeine Java-Themen 8
J IMDB Name und Bewertung auslesen Allgemeine Java-Themen 10
J .txt erstellen, nach name der vorhergehenden txt Allgemeine Java-Themen 7
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
S java -jar name.war. Wie Extraktionspfad umbiegen? Allgemeine Java-Themen 2
S [JUnit] Name von TestCase bekommen Allgemeine Java-Themen 4
D Passende Name für Methoden finden Allgemeine Java-Themen 3
Dit_ Registry, Preferences | Name des Knotens ändern. Allgemeine Java-Themen 2
E String name in class convertieren Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
S Konstrukt Sinn, Zewck und Name Allgemeine Java-Themen 6
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
D variabler Listen name Allgemeine Java-Themen 3
M Name der Swing Komponente Allgemeine Java-Themen 3
C Name einlesen und Programm starten Allgemeine Java-Themen 2
S "Guessed User name" bei Tomcat belegen Allgemeine Java-Themen 2
J Name eines Strings durch einen String festlegbar? Allgemeine Java-Themen 2
M Name von Wochentagen vergleichen Allgemeine Java-Themen 3
M Zugriff auf Objekt, Name in Variable Allgemeine Java-Themen 3
F Welcher Name? paintsXY(), isPaintXY(), isPaintingXY() . Allgemeine Java-Themen 4
V Objekt einer Klasse, deren Name nur als String vorhanden Allgemeine Java-Themen 4
D Name der Java-Applikation Allgemeine Java-Themen 2
A Class File zur Laufzeit laden ohne den Binary Name zu kennen Allgemeine Java-Themen 11
G jar-Name einer Klasse Allgemeine Java-Themen 9
O String übergeben ist name eines JTextField wie zugreifen Allgemeine Java-Themen 9
S Name der ausführenden jar-Datei abfragen Allgemeine Java-Themen 11
Y fehler: wrong name serverA Allgemeine Java-Themen 3
F Parameter Name herausfinden Allgemeine Java-Themen 25
H Package name aus Class-File auslesen Allgemeine Java-Themen 11
P Duplicate name in Manifest Allgemeine Java-Themen 6
J Name des aktuell aktiven Windows-Fensters abfragen? Allgemeine Java-Themen 4
T JUSB - Name des USB Endgerätes zurückgeben Allgemeine Java-Themen 2
L Systeminformationen (PC-Name und Kennwort) auslesen Allgemeine Java-Themen 9
B Name eines komischen Klassenkonstruktes Allgemeine Java-Themen 14
S Sortierung einer Collection nach dem Attribut "name&quo Allgemeine Java-Themen 3
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
sandaime CMD aufrufen und aktuellen pfad ändern Allgemeine Java-Themen 11
B Aktuellen Sourcecode aus Browser laden Allgemeine Java-Themen 43
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
P Aktuellen HTML Code auslesen (von JS manipuliert) Allgemeine Java-Themen 3
J Klassen Stromverbrauch des Aktuellen Systems Allgemeine Java-Themen 8
J Aktuellen Prozess herausfinden. Allgemeine Java-Themen 3
H Auslesen der aktuellen URL eines geöffneten Browser? Allgemeine Java-Themen 17
Steev Screenshot vom Bereich behind dem aktuellen Fenster machen Allgemeine Java-Themen 24
F Wie erfahre ich dynamisch den namen eines aktuellen Objektes Allgemeine Java-Themen 2
M Aktuellen heap space ermitteln? Allgemeine Java-Themen 2
R Exceptions mit aktuellen Programminformationen ausgeben? Allgemeine Java-Themen 2
S Aktuellen Methodennamen ermitteln (MIT Java 1.3) Allgemeine Java-Themen 2
Speed FariyDragon Startsituation des Programms Feststellen Allgemeine Java-Themen 1
Lukas2904 Automatisches starten des Programms Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
J Webstart Lizenz des entwickelten Java-Programms Allgemeine Java-Themen 5
S Fehlermeldungen erscheinen erst in der Ausführung des Programms Allgemeine Java-Themen 11
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
MineJoke "Config" Datein wir bei neustart des Programms neu erstellt? Allgemeine Java-Themen 0
X Skalierung von Bildern zum Start des Programms Allgemeine Java-Themen 3
R Instanzen eines Programms Allgemeine Java-Themen 8
H Copy Paste implementieren ausserhalb des Programms? Allgemeine Java-Themen 2
Fab1 Komponenten eines zweiten Java Programms auslesen Allgemeine Java-Themen 8
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
M Umgebungsvariable Version des Programms Allgemeine Java-Themen 10
C Ablauf des Programms anhalten, bis.... Allgemeine Java-Themen 5
N Erste Schritte Neuschreiben eines C++ Programms in Java Allgemeine Java-Themen 4
L Richtige Dokumentation eines Java Programms Allgemeine Java-Themen 5
T Update eines Programms - Beenden eines anderen Prozesses überwachen Allgemeine Java-Themen 8
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
H Mehrfachen Start des Programms verhindern Allgemeine Java-Themen 6
E Standort des Programms herausfinden Allgemeine Java-Themen 4
P Sauberes Beenden des Programms beim Herunterfahren? Allgemeine Java-Themen 9
G Erweiterung eines Programms Allgemeine Java-Themen 29
G Konfiguration eines Java- Programms Allgemeine Java-Themen 20
G Speicherverbrauch eines Programms Allgemeine Java-Themen 2
P Start eines Programms scheitert an Java Allgemeine Java-Themen 9
A Nur eine Instanz eines Programms ausführen Allgemeine Java-Themen 3
S Mausklick außerhalb des Programms erzeugen? Allgemeine Java-Themen 23
B nur eine Instanz eines Programms laufen lassen Allgemeine Java-Themen 8
J Problem bei Ablauf des Programms DuddeDa Allgemeine Java-Themen 7
S Aufruf meines Programms Allgemeine Java-Themen 2
I Sprache zur Laufzeit des Programms ändern Allgemeine Java-Themen 3
G Laufzeit eines aus Java gestarteten Programms beobachten Allgemeine Java-Themen 3
P Priorität einen Programms erhöhen, wie mach ich das? Allgemeine Java-Themen 3
P Nur eine Instanz eines Programms zulassen, wie geht das? Allgemeine Java-Themen 15
M err oder alle Exceptions eines Programms abfangen Allgemeine Java-Themen 4
C Probleme beim Starten eines Java-Programms Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben