2015-09-12 14 views
43

Javaプロジェクトでjna.jar、jna-3.2.5.jar、jna-3.3.0-platform.jarを使用しています。JNAを使用して `MagImageScalingCallback`を正しくマッピングするにはどうすればよいですか?

これは私が複製したいWinapiの機能です。

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

私はコールバックのこのメソッドに入るときは、この私の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); 
} 

は、私が予期しない結果を得るされています

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

この表は「doesnの何動作し、何を説明変数のデータ型を変更すると、32ビットと64ビットのシステムで動作します。

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

が動作していない私は、64ビットシステムで上記のコードを使用する場合、私はデスクトップをキャプチャすることができ

結果で完全に黒画像を意味する(Iからのデータにアクセスすることができますポインタ変数)。私が32ビットシステムで同じコードを使用すると、私はイメージを取得していません。あなたが見ることができますmy whole code

なぜ私のコードのエラーですか?どうすれば修正できますか?

あなたの情報をお寄せください。 screenSkip.javaにあるように、MagSetWindowSource関数が呼び出されたときはいつでも。 MagImageScalingCallback(80行目)が呼び出されます。このsection of code

問題Iが64ビットシステムsrcdatadestdataにこのコードを実行するデスクトップの整数画素のアレイを保持する(Iは画像としてこれを保存した場合、それはデスクトップをキャプチャ)。しかし、32ビットシステムで同じコードを実行すると、これらの両方の可変配列ピクセル値は常にゼロになります(画像を保存すると、常に黒です)。 [2] ] [2]

32ビットシステムデビッド・Heffernanの@ enter image description here

Iが32ビットシステム上でこのコードを実行しています。私はThe Magnification API is not supported under WOW64;を知っています。つまり、32ビットシステムでは32ビットの倍率アプリケーションが動作し、64ビットシステムでは64ビットの倍率アプリケーションが機能します。 WOW64で倍率APIが動作しないことをコメントして、このコードを32ビットシステムで実行しようとしてください。

お客様のご要望に応じて、下の画像は私のシステムの構成を示しています。

enter image description here

+0

あなたが複製しようとしている 'C'イディオムとは何ですか?'struct'の扱いは、パラメータの参照(' struct * ')と集約フィールドの値(' struct')によるものです。 Javaの 'Structure'タグインターフェース(' ByValue'、 'ByReference')は、補完的な慣習を強制するものです。他のすべての値は値渡しされ、 'com.sun.jna.ptr'パッケージに' ByReference'実装の範囲が存在し、値のアドレスを渡すことを容易にします。 – technomage

+0

@technomage質問を更新しました。あなたが理解できなかったら私にpingしてください。 – Vishnu

+0

'Pointer'は常に値によって渡されます。 64ビットであれ32ビットであれ、ネイティブシグネチャが値によって構造体を要求する場合は、それを値渡しする必要があります(64ビットの場合、 'struct * 'を渡すことは偶然に起こりました。コンパイラが小さな 'struct'値を渡す方法)。 – technomage

答えて

1

コールバックが適切である - あなたは推奨されない機能を使用している横に何の欠点は、あなたのコードではありません。

は、これを使用することを検討してください:

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

キャプチャからいくつかのウィンドウをスキップしたいです。あなたの答えは非常に基本的なコードです。 – Vishnu

+0

でもコードの一部を使用して取得する矩形を決定できます。 – bebbo

関連する問題