2


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

4

2 回答 2

1

我放弃了评论,但值得回答。添加本机代码,MPlayer,所以你被 impl 和操作系统困住了。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,那么您需要另一种方法来获取它,因为正如我提到的,getPeer() 甚至还没有被具有类似功能的某些方法所取代,它现在实际上已成为“私有”。

于 2011-03-09T01:09:46.493 回答