2


JavaアプリケーションでMPlayerを使用しています。そのドキュメントによると、それを埋め込むためのウィンドウIDをMPlayerに伝える必要があります。私はそのようにこれをやっています:

long winid = 0; //Window ID.
if (osName.startsWith("Windows")){
   final Class<?> cl = Class.forName("sun.awt.windows.WComponentPeer");
   java.lang.reflect.Field f = cl.getDeclaredField("hwnd");
   f.setAccessible(true);
   winid = f.getLong(overlay.getPeer()); //overlay is a canvas where MPlayer is embedded.
}
System.out.println(winid);

ただし、getPeer()メソッドは非推奨です。回避策があるかどうか知りたいです。
助けてくれてありがとう。

4

2 に答える 2

1

コメントを落としましたが、それは答えに値します。ネイティブコードMPlayerを追加すると、implとOSに固執します。getPeer()の非推奨は、ほとんどの場合b / cであり、移植性がなく、本当に奇妙なことを行うことができます。

あなたの場合、それは問題ではありません。

補足:WComponentPeerにはパブリックgetHWnd()メソッドがあるため、リフレクションを介してそれをだます必要はありません。現在使用しているコードは、実際のピアをチェックしないため、実際にはかなり安全ではありません。

次のように置き換えることができます。

long hWnd = 0
try{ 
  Class clazz = Class.forName("sun.awt.windows.WComponentPeer);
  synchronized(overlay.getTreeLock()){
    ComponentPeer peer = overlay.getPeer();
    if (clazz.isInstance(peer)){
      hWnd = ((sun.awt.windows.WComponentPeer) overlay.getPeer()).getHWnd();
    }
  }
}catch(ClassNotFound _noWindows){
//process..
}

幸運を!

于 2011-03-09T01:25:46.907 に答える
0

ドキュメントによると、getPeer()はisDisplayable()に置き換えられていますが、これでは必要なものが得られません。どうやら、あなたのようにピアにアクセスすることは仕様違反です(詳細についてはこちらをご覧ください)。

どうしてもIDが必要な場合は、IDを取得する別の方法が必要です。前述したように、getPeer()は同様の機能を持つメソッドに置き換えられていないため、事実上「プライベート」になっています。

于 2011-03-09T01:09:46.493 に答える