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>
 
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
 
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
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.
 
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.
 
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:
 
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.
 
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.
 
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.
 
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.
 
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".
 
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
 

Neue Themen


Zurück
Oben