【问题标题】:Create child Window of another process's HWND? (e.g. screensaver preview)创建另一个进程的 HWND 的子窗口? (例如屏幕保护程序预览)
【发布时间】:2012-04-08 23:44:57
【问题描述】:

我正在用 Java 编写屏幕保护程序。它主要适用于 Windows,但我希望它尽可能便携。

根据http://support.microsoft.com/kb/182383,当使用命令行参数/p HWND 调用屏幕保护程序时,屏幕保护程序应该“Preview Screen Saver as child of window ”。大概这就是屏幕保护程序应该如何在“屏幕保护程序设置”对话框中进行小预览的方式。

那么,在 Java 中,如何创建属于其他人的窗口的子窗口的 JFrame 或 JComponent? 我看过Embed HWND (Window Handle) in a JPanel 这是一个相反的问题:开发人员控制父窗口并希望嵌入一个子窗口。在我的例子中,我控制了一个我想要嵌入到不是“我的”父级的子组件。我可以使用JNA 来做到这一点吗?

除了 Java 代码之外,我宁愿不必维护 C 代码。 (所以 JNI 不是首选。)我知道 JDIC 应该满足这种需求,但我读到 JDIC 基本上已经死了。

我正在运行 Windows 7,FWIW。

【问题讨论】:

  • 不是该领域的专家,但认为这是不可能的,因为您的 Java 应用程序必须接管 Windows 进程 - 从安全角度来看,这似乎是错误的。
  • @DmitryB:我想了解更多。某些程序显然可以这样做(所有兼容的屏幕保护程序都可以)......但对于 Java 程序却不是?
  • @DmitryB:参见例如harding.edu/fmccown/screensaver/screensaver.html 用于执行此操作的 C# 实现:SetParent(this.Handle, PreviewWndHandle);
  • hmmm 是的......根据教程,Java 不是“任何 .NET 编程语言”:) 我不得不使用 JNA 库与 dll 对话——这很难。每个方法都必须如此导出,并且所有变量都必须对齐。
  • @DmitryB:Java 不是“任何 .NET 编程语言”这一事实是正确的,但这只是意味着该教程并没有说你可以用 Java 做到这一点。它确实not 意味着教程说你不能 在Java 中做到这一点。而且(我的观点是)您可以在 .NET 中执行此操作这一事实表明它在 Windows 中“从安全角度来看是错误的”。但我很高兴看到更多细节表明SetParent() 在某种程度上是“特殊的”,并且在纯 Java 中是不可能的。

标签: java windows windows-7 screensaver hwnd


【解决方案1】:

你需要调用一个win32 api。该 api 在 C 中。您需要互操作层来执行此操作。我认为每个选项都会很糟糕。

对于Java,我认为是JNI。 See this 如何做到这一点。

您还需要将该值传递给SetParent

屏幕保护程序以与屏幕保护程序对话框相同的安全权限运行,因此这不是安全问题。

【讨论】:

  • 我引用的文章 (stackoverflow.com/questions/4809713/…) 指出 SetParent() 并建议可以使用 JNA 来完成,正如我所提到的,它比 JNI 更受欢迎。你是说 JNA 做不到?
【解决方案2】:

看看Jdic,它有an SDK 用于屏幕保护程序,所以至少你可以研究他们的代码..

【讨论】:

  • 更正(自我说明):sdk svn 结帐 URL 是 https://svn.java.net/svn/jdic~svn/trunk。 SaverBeans SDK 通过使用“预构建的本机库”来工作,因此这本身并不是一个纯 Java 解决方案,但它可能是我可以通过 JNA 使用的东西。
  • 嗯...这似乎是一个死胡同。我在 src 树中唯一能找到的类似于我上面要求的内容是在 trunk/src/incubator/screensaver/src/ant-native/win32/saverbeans-win32.cpp 中,它表示“当前的策略是创建一个作为本机窗口子窗口的 EmbeddedFrame 并从中获取 Graphics 对象。”但我不知道它是否真的适用,也不知道如何使用它。 AFAICT,java代码似乎不知道适合子预览窗口。我也找不到 SaverBeans 屏幕保护程序包的下载来验证(未找到)。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
相关资源
最近更新 更多