Wie ordne ich einen „MagImageScalingCallback“ mit JNA richtig zu?

Lesezeit: 4 Minuten

Benutzer-Avatar
Vishnu

Ich verwende jna.jar, jna-3.2.5.jar und jna-3.3.0-platform.jar in meinem Java-Projekt.

Dies ist die Winapi-Funktion, die ich replizieren möchte.

BOOL WINAPI MagImageScalingCallback(
  _In_  HWND           hwnd,
  _In_  void           *srcdata,
  _In_  MAGIMAGEHEADER srcheader,
  _Out_ void           *destdata,
  _In_  MAGIMAGEHEADER destheader,
  _In_  RECT           unclipped,
  _In_  RECT           clipped,
  _In_  HRGN           dirty
);

Das ist mein Java-Code

public interface MagImageScalingCallback extends StdCallLibrary.StdCallCallback{
    public boolean MagImageScalingCallback(HWND hwnd,
            Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader,
            Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader,
            RectByValue source,
            RectByValue clipped,
            HRGN dirty);
}

Wenn ich in diese Methode des Rückrufs einsteige, erhalte ich unerwartete Ergebnisse:

    public boolean MagImageScalingCallback(HWND hwnd, Pointer srcdata,
            MAGIMAGEHEADER.ByValue srcheader, Pointer destdata,
            MAGIMAGEHEADER.ByValue destheader, RectByValue source, RectByValue clipped, HRGN dirty) {
        image.setRGB(0, 0, srcheader.width, srcheader.height, srcdata.getIntArray(0, srcheader.width * srcheader.height ), 0, srcheader.width);
        return true;
    }

Diese Tabelle erklärt, was in 32-Bit- und 64-Bit-Systemen funktioniert und was nicht, wenn ich den Datentyp der Variablen ändere.

+--------------+--------------+-------------+-------------+
| Parameter    | Data type    |   64 bit    |   32 bit    |
+--------------+--------------+-------------+-------------+
| source       | WinDef.RECT  |   Working   | Not Working |
| clipped      | WinDef.RECT  |   Working   | Not Working |
| source       | RectByValue  |   Working   |   Working   |
| source       | RectByValue  |   Working   |   Working   |
| srcdata      | Pointer      |   Working   | Not Working |
| destdata     | Pointer      |   Working   | Not Working |
+--------------+--------------+-------------+-------------+

Nicht funktionieren bedeutet ein komplett schwarzes Bild im Ergebnis

Wenn ich den obigen Code in einem 64-Bit-System verwende, kann ich den Desktop erfassen (ich kann auf die Daten der Pointer-Variable zugreifen). Wenn ich denselben Code in einem 32-Bit-System verwende, erhalte ich kein Bild. Du kannst sehen mein ganzer Code

Warum ist der Fehler in meinem Code? Wie kann ich das beheben?

Für Ihre Information. Wie Sie in der sehen screenSkip.java, Immer wenn die MagSetWindowSource-Funktion aufgerufen wird. MagImageScalingCallback(in Zeile 80) wird aufgerufen.

Probleme dabei Abschnitt des Codes

Wenn ich diesen Code auf einem 64-Bit-System ausführe srcdata und destdata enthält das Array von ganzzahligen Pixeln des Desktops (wenn ich dies als Bild speichere, erfasst es den Desktop). Aber wenn ich denselben Code auf einem 32-Bit-System ausführe, sind diese beiden variablen Array-Pixelwerte immer Null (wenn ich das Bild speichere, ist es immer schwarz).

64-Bit-System
Geben Sie hier die Bildbeschreibung ein

32-Bit-System
Geben Sie hier die Bildbeschreibung ein

@david-heffernan Ich führe diesen Code auf einem 32-Bit-System aus. Ich weiss The Magnification API is not supported under WOW64;. Das bedeutet, dass die 32-Bit-Vergrößerungsanwendung auf einem 32-Bit-System und die 64-Bit-Vergrößerungsanwendung auf einem 64-Bit-System funktioniert. Bitte hören Sie auf zu kommentieren, dass die Vergrößerungs-API unter WOW64 nicht funktioniert, und versuchen Sie, diesen Code auf einem 32-Bit-System auszuführen.

Was Ihre Anfrage betrifft, zeigt das folgende Bild die Konfiguration meines Systems.

Geben Sie hier die Bildbeschreibung ein

  • Was ist der C Redewendung, die Sie zu replizieren versuchen? struct Handhabung erfolgt durch Verweis (struct *) für Parameter und nach Wert (struct) in aggregierten Feldern. Das Java Structure Tagging-Schnittstellen (ByValue, ByReference) sind dazu da, die komplementäre Konvention zu erzwingen. Alle anderen Werte werden als Wert übergeben und es gibt einen Bereich von ByReference Implementierungen in der com.sun.jna.ptr Paket, um die Übergabe “der Adresse von” eines Werts zu erleichtern.

    – Technomagier

    12. September 2015 um 10:44 Uhr


  • @technomage Ich habe die Frage aktualisiert. Bitte pingen Sie mich an, wenn Sie es nicht verstanden haben.

    – Vishnu

    12. September 2015 um 11:19 Uhr

  • Pointer wird immer als Wert übergeben. Ob 64- oder 32-Bit, wenn die native Signatur nach einer Struktur nach Wert fragt, müssen Sie sie nach Wert übergeben (es ist nur zufällig, dass die Übergabe einer struct* funktionierte zufällig in Ihrem 64-Bit-Fall, da der Compiler mit dem Übergeben von kleinen Werten umgeht struct Werte).

    – Technomagier

    12. September 2015 um 13:10 Uhr

  • @technomage wie kann ich das Problem beheben?

    – Vishnu

    13. September 2015 um 7:56 Uhr

  • Wenn Sie die verwenden SIZE_T Typ JNA sollte sich um den Größenunterschied kümmern (vorausgesetzt, Sie meinen das cbSize-Feld in MAGIMAGEHEADER). Aus dem obigen SO-Link würde ich nicht erwarten, dass dies im 32-Bit-Modus unter 64-Bit-Fenstern funktioniert.

    – Technomagier

    18. September 2015 um 11:50 Uhr


Benutzer-Avatar
bebbo

Der Rückruf ist korrekt – es gibt keinen Fehler in Ihrem Code, außer dass Sie veraltete Funktionen verwenden.

Erwägen Sie, dies zu verwenden:

try {
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage  capture = new Robot().createScreenCapture(screenRect);
    ImageIO.write(capture, "JPEG", new File("printed1.jpg"));
} catch (Exception e) {
    e.printStackTrace();
}

  • Ich möchte, dass einige Fenster von der Erfassung übersprungen werden. Ihre Antwort ist ein sehr einfacher Code.

    – Vishnu

    15. Januar 2016 um 2:48 Uhr

  • Sie können immer noch einige Teile Ihres Codes verwenden, um das zu greifende Rechteck zu bestimmen.

    – bebo

    15. Januar 2016 um 10:46 Uhr

1082230cookie-checkWie ordne ich einen „MagImageScalingCallback“ mit JNA richtig zu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy