Comment mapper correctement un `MagImageScalingCallback` en utilisant JNA?

J’utilise jna.jar, jna-3.2.5.jar et jna-3.3.0-platform.jar dans mon projet Java.

C’est la fonction Winapi que je veux répliquer.

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 ); 

Ceci est mon code Java

 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); } 

Lorsque j’entre dans cette méthode du rappel, j’obtiens des résultats inattendus:

  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; } 

Ce tableau explique ce qui fonctionne et ce qui ne fonctionne pas dans un système 32 bits et 64 bits lorsque je modifie le type de données des variables.

 +--------------+--------------+-------------+-------------+ | 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 | +--------------+--------------+-------------+-------------+ 

Ne pas travailler signifie une image totalement noire dans le résultat

Si j’utilise le code ci-dessus dans un système 64 bits, je peux capturer le bureau (je peux accéder aux données à partir de la variable Pointeur). Si j’utilise le même code dans un système 32 bits, je ne reçois aucune image. Vous pouvez voir tout mon code

Pourquoi l’erreur est-elle dans mon code? Comment puis-je résoudre ce problème?

Pour ton information. Comme vous le voyez dans screenSkip.java , chaque fois que la fonction MagSetWindowSource est appelée. MagImageScalingCallback (à la ligne 80) est appelée.

Problèmes dans cette section de code

Si srcdata ce code sur un système 64 bits, srcdata et destdata contiendront le tableau de pixels entiers du bureau (si je l’enregistre en tant qu’image, il capture le bureau). Mais si je lance le même code sur un système 32 bits, ces deux valeurs de pixels de tableau variable sont toujours nulles (si je sauvegarde l’image, elle est toujours noire)

Système 64 bits [! [Entrer la description de l’image ici] [2]] [2]

Système 32 bits entrer la description de l'image ici

@ david-heffernan J’utilise ce code sur un système 32 bits. Je sais que l’ The Magnification API is not supported under WOW64; . Cela signifie que l’application d’agrandissement 32 bits fonctionne sur un système 32 bits et que l’application d’agrandissement 64 bits fonctionne sur un système 64 bits. Veuillez cesser de commenter que l’API de grossissement ne fonctionne pas sur WOW64 et essayez d’exécuter ce code sur un système 32 bits.

Comme pour votre demande, l’image ci-dessous montre la configuration de mon système.

entrer la description de l'image ici

Le rappel est correct – il n’y a pas de défaut dans votre code, à côté de vous utilisez des fonctions obsolètes.

Pensez à utiliser ceci:

  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(); }