【发布时间】: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