Verwendung jna

Thommy7571

Mitglied
Trotz Import der jna Version 5.13 werden einzelne Methoden und Konstanten nicht gefunden, die Bestandteil von winNT sein sollten. z.B. .UNLEN und .GetUserName im code
<code>
public static void screenshot() {
char[] buffer = new char[WinNT.UNLEN + 1];
IntByReference len = new IntByReference(buffer.length);
boolean result = Kernel32.INSTANCE.GetUserNameW(buffer, len);
if (result) {
System.out.println("Benutzername: " + Native.toString(buffer));
} else {
System.err.println("Fehler beim Abrufen des Benutzernamens");
}
}
<\code>
 

KonradN

Super-Moderator
Mitarbeiter
Was genau hast wie eingebunden?
Du brauchst nicht nur die jna Library sondern auch die jna-platform Library.

Was ist die genaue Fehlermeldung? Hast Du passende Imports?
WinNT ist z.B. in com.sun.jna.platform.win32
 

Thommy7571

Mitglied
Sorry, dass ich erst so spät antworte. Ich war sehr/ bin sehr beschäftigt. Danke für die Antwort. Ja ich habe beide Bibliotheken importiert. Die Bibliotheken werden gefunden, aber die darin enthaltenen Methoden nicht. Siehe Bild.
 

Anhänge

  • fehler.JPG
    fehler.JPG
    68,8 KB · Aufrufe: 2

KonradN

Super-Moderator
Mitarbeiter
Da wäre dann die Frage: Wie kommst Du darauf, dass WinNT ein UNLEN hat?

Das gleiche gilt für Kernel32.getUserName - das findet sich auch nicht:

Die Methode findet sich aber in Advapi32:
oder man nutzt direkt Advapi32Util:
(das erspart einem dann das Erstellen des Buffers und so)
 

KonradN

Super-Moderator
Mitarbeiter
Haha, ja, wenn ChatGPT keine Antwort hat, dann erfindet es etwas.

Bei der API kann man das etwas unterdrücken aber im Web-Frontend kann man das nicht beeinflussen.
 

KonradN

Super-Moderator
Mitarbeiter
Wobei es auch sein kann, dass er es mit alten Versionen mixt … evtl. gab es das mal in V3 oder früher.
 

Neumi5694

Top Contributor
Java:
new com.sun.security.auth.module.NTSystem().getName();

Ich kann nur annehmen, dass der Kernel-Wrapper diese Methoden nicht anbietet, weil es bessere standardisierte Vorgehensweisen gibt.

UNLEN war eh nie notwendig. Ein Stringbuffer darf gerne auch zu lang sein, am Ende des gültigen Strings findet sich ein null Zeichen, welches von den Native-Konvertern erkannt wird. Schlimmstenfalls einfach mal 1024 Bytes reservieren, sollten für einen Benutzernamen reichen.
 

KonradN

Super-Moderator
Mitarbeiter
Die Frage ist, was Du genau machen willst. Rein den Username bekommt man auch per System.getProperty("user.name");

Unter Windows könnte man die Environment Variablen ebenfalls auslesen - dann hätte man auch die Userdomain und so.

Deine Methode heisst aber screenshot - wenn Du in erster Linie einen Screenshot bekommen willst, dann wäre die Frage: Von was? Dem Bildschirm? Ein bestimmtes Fenster? Oder gar ein Fenster Deiner Anwendung?

Eine einfache Lösung wäre die Klasse Robot mit createScreenCapture:
 

Neumi5694

Top Contributor
Falls du etwas rumexperimentieren willst, kannst du Java auch recht einfach betrügen
Java:
package simpleusername;
import com.sun.security.auth.module.NTSystem;
public class DisplayUsername {
  public static void main(String[] args) {
    System.out.println(System.getProperty("user.name"));
    System.out.println(System.getenv("USERNAME"));
    System.out.println(new NTSystem().getName());
  }
}

Der Batch-Aufruf
Bash:
set USERNAME=Heinrich
java -jar DisplayUserName.jar
liefert als Ergebnis
Heinrich
Heinrich
<wie auch immer dein Username ist>


ps: Die genannte Api-Funktion ist ja im Windows-Kernel vorhanden. Wenn du sie also auf Teufel Komm Raus verwenden willst, dann kannst du auch das Kernel Interface entsprechend erweitern.
 

Thommy7571

Mitglied
Die Frage ist, was Du genau machen willst. Rein den Username bekommt man auch per System.getProperty("user.name");

Unter Windows könnte man die Environment Variablen ebenfalls auslesen - dann hätte man auch die Userdomain und so.

Deine Methode heisst aber screenshot - wenn Du in erster Linie einen Screenshot bekommen willst, dann wäre die Frage: Von was? Dem Bildschirm? Ein bestimmtes Fenster? Oder gar ein Fenster Deiner Anwendung?

Eine einfache Lösung wäre die Klasse Robot mit createScreenCapture:
Ja danke, die Robot-Klasse hatte ich von ChatGPT vorgeschlagen bekommen. Funktioniert sehr gut.
 

Thommy7571

Mitglied
Falls du etwas rumexperimentieren willst, kannst du Java auch recht einfach betrügen
Java:
package simpleusername;
import com.sun.security.auth.module.NTSystem;
public class DisplayUsername {
  public static void main(String[] args) {
    System.out.println(System.getProperty("user.name"));
    System.out.println(System.getenv("USERNAME"));
    System.out.println(new NTSystem().getName());
  }
}

Der Batch-Aufruf
Bash:
set USERNAME=Heinrich
java -jar DisplayUserName.jar
liefert als Ergebnis



ps: Die genannte Api-Funktion ist ja im Windows-Kernel vorhanden. Wenn du sie also auf Teufel Komm Raus verwenden willst, dann kannst du auch das Kernel Interface entsprechend erweitern.
Vielen Dank, hilfreich auf jeden Fall. ChatGPT hatte mir als Beispiel für einen Zugriff auf eine Windowsbibliothek dieses einfache Beispiel genannt. Ich hätte mir natürlich denken können, dass es da einfache Lösungen in Java gibt. Ich hatte gehofft durch dieses Beispiel auch mit einer Bibliothek zu arbeiten, die es ermöglicht auf eine Windows -Funktion wie Screenshot zuzugreifen. Das dürfte ja auch der Fall sein. Einerseits sollte ich mir angesichts des Aufwandes wohl überlegen, ob ich über Java auf Windows zugreifen will. Andererseits wird es für mich wohl am besten so sein. Alles in C++ wäre ziemlicher Aufwand, da ich kein c++ kann.
 

Thommy7571

Mitglied
Ermöglichen die von Dir angegebenen Bibliotheken einen Bildschirmausschnitt (also nicht den ganzen Bildschirm) sozusagen zu fotografieren? Der Zugriff auf Windows wäre mir neben dem Screenshot aber auch noch aus einem anderen Grunde wichtig. Ich möchte einen Screenshot bei einem Klickereignis haben, aber nicht nur auf eine Javakomponente, sondern beliebig auf einen Browser oder so, um bei einer Präsentation ohne Video Bildschirmphotos auf Mausklick zu erhalten.
 

KonradN

Super-Moderator
Mitarbeiter
Ermöglichen die von Dir angegebenen Bibliotheken einen Bildschirmausschnitt (also nicht den ganzen Bildschirm) sozusagen zu fotografieren? Der Zugriff auf Windows wäre mir neben dem Screenshot aber auch noch aus einem anderen Grunde wichtig. Ich möchte einen Screenshot bei einem Klickereignis haben, aber nicht nur auf eine Javakomponente, sondern beliebig auf einen Browser oder so, um bei einer Präsentation ohne Video Bildschirmphotos auf Mausklick zu erhalten.
Ja, Robot kannst Du sagen, welchen Ausschnitt Du willst. Und genau der wird dann "fotografiert".
 

Neumi5694

Top Contributor
Vielen Dank, hilfreich auf jeden Fall. ChatGPT hatte mir als Beispiel für einen Zugriff auf eine Windowsbibliothek dieses einfache Beispiel genannt. Ich hätte mir natürlich denken können, dass es da einfache Lösungen in Java gibt. Ich hatte gehofft durch dieses Beispiel auch mit einer Bibliothek zu arbeiten, die es ermöglicht auf eine Windows -Funktion wie Screenshot zuzugreifen. Das dürfte ja auch der Fall sein. Einerseits sollte ich mir angesichts des Aufwandes wohl überlegen, ob ich über Java auf Windows zugreifen will. Andererseits wird es für mich wohl am besten so sein. Alles in C++ wäre ziemlicher Aufwand, da ich kein c++ kann.
Für die Screenshot-Funktion ist der Zugriff auf die Verzeichnisse wohl eher irrelevant.
Sofern nicht bereits Standardmethoden dafür existieren, kann jedes Systemverzeichnis über seine GUID ermittelt werden.
Aber ich glaube für dein Problem ist das nicht wichtig. Wenn der Robot das kann, dann dürfte dich das alles nicht interessieren
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
b1ck Scanner schließen, erneute Verwendung Java Basics - Anfänger-Themen 12
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
A Verwendung von Interfaces Java Basics - Anfänger-Themen 7
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D native Methoden, Verwendung? Java Basics - Anfänger-Themen 8
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
G verwendung von regex Java Basics - Anfänger-Themen 3
K Problem bei der Verwendung von Gregorian Calender Java Basics - Anfänger-Themen 3
T NullPointerException bei Verwendung einer Klasse einer anderen .jar datei Java Basics - Anfänger-Themen 3
B Wie wichtig ist Verwendung von StringBuffer in Schleifen? Java Basics - Anfänger-Themen 10
B Verwendung von Arrays Java Basics - Anfänger-Themen 2
U Verwendung von Interface Java Basics - Anfänger-Themen 33
A Methoden Verwendung von crypt? Java Basics - Anfänger-Themen 2
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
D reg Exp, verwendung des endezeichen "$" Java Basics - Anfänger-Themen 5
C Verwendung von Schleifen? Java Basics - Anfänger-Themen 18
J Datentypen Array - Verwendung im Konstruktor Java Basics - Anfänger-Themen 8
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
J Problem mit NullPointerException bei Verwendung eines Arrays Java Basics - Anfänger-Themen 6
D Frage zur Verwendung einer Schnittstelle Java Basics - Anfänger-Themen 4
A Verwendung von abstrakten Klassen Java Basics - Anfänger-Themen 17
D Verwendung der Klasse Map Java Basics - Anfänger-Themen 9
C Verwendung von Matrizen in einer Schleife Java Basics - Anfänger-Themen 5
F Umlaute eines Strings entfernen (Verwendung von this?) Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
I Verwendung von Constant Field Values Java Basics - Anfänger-Themen 4
J Verwendung von eigenen Klassen in JSP Java Basics - Anfänger-Themen 2
G try. catch Verwendung Java Basics - Anfänger-Themen 11
Z Beispiel Würfelspiel mit Verwendung von Feldern Java Basics - Anfänger-Themen 7
H Verwendung lokaler Einstellungen Java Basics - Anfänger-Themen 4
G getName, substring Verwendung Java Basics - Anfänger-Themen 3
I Fehler bei Verwendung von substring Java Basics - Anfänger-Themen 4
S Verwendung von Super Java Basics - Anfänger-Themen 7
M Verwendung von Robot... wie? Java Basics - Anfänger-Themen 6
M Verwendung von "this" Java Basics - Anfänger-Themen 2
U Liste importieren und für weitere Verwendung sichern Java Basics - Anfänger-Themen 4
feuervogel Integral unter Verwendung der Java-Bibliothek berechnen Java Basics - Anfänger-Themen 10
frau-u Probleme mit richtiger Verwendung von FileInputStream Java Basics - Anfänger-Themen 2
S valueOf() vs. toString() Verwendung??? Java Basics - Anfänger-Themen 13
A Kurze Frage zur Verwendung von this Java Basics - Anfänger-Themen 9
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6
F Verwendung von this in statischen Kontext nicht möglich Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben