我在Java应用程序中使用MPlayer。根据其文档,我需要告诉MPlayer嵌入它的窗口ID。我这样做是这样的:

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()方法。我想知道是否有解决方法。
非常感谢您的帮助。

最佳答案

我发表了评论,但值得回答。
添加本机代码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..
}


祝好运!

09-08 03:35