【发布时间】:2012-02-15 10:57:59
【问题描述】:
我一直在用 Java 制作屏幕保护程序,现在正在研究命令行参数支持。为此,here 列出的潜在参数之一是将屏幕保护程序作为指定窗口的子窗口。我怎样才能接受这个论点并获得必要的窗口来放置屏幕保护程序?
另外,“模态到窗口”是什么意思?
【问题讨论】:
标签: java command-line-arguments screensaver
我一直在用 Java 制作屏幕保护程序,现在正在研究命令行参数支持。为此,here 列出的潜在参数之一是将屏幕保护程序作为指定窗口的子窗口。我怎样才能接受这个论点并获得必要的窗口来放置屏幕保护程序?
另外,“模态到窗口”是什么意思?
【问题讨论】:
标签: java command-line-arguments screensaver
在 Windows 中,您从 somewhere in the control panels 设置屏幕保护程序。为了让控制面板与第三方屏幕保护程序交互,它被设计为使用特定的命令行参数运行它们。
因此,当您从列表中选择屏幕保护程序并点击“预览”按钮时,控制面板会执行以下命令:
ScreenSaver /p 1234
这里的“ScreenSaver”将指向您的程序的路径,而 1234 将是一个指针值,为控制面板窗口提供 HWND 引用。然后,屏幕保护程序需要将自身添加为该窗口的子窗口以提供预览。
同样,当您点击“设置”按钮时,控制面板会执行以下命令:
ScreenSaver /c
屏幕保护程序需要知道,当它获取命令行参数时,它应该向系统查询哪个窗口在前台,并在该窗口中弹出一个对话框(“模态”意味着它阻止访问直到对话框关闭)。
最后,当控制面板确定是时候运行屏幕保护程序时,它会执行这个命令:
ScreenSaver /s
此时你的程序应该全屏显示。
现在,作为 Java 开发人员,这对您意味着什么?
首先,将 Java 组件插入系统窗口会涉及一些复杂的 JNI 工作。对于预览,您可以做的最好的事情是让您的 Java 代码呈现为图像,然后通过 JNI 将其绘制到普通的 Windows 组件中。在系统窗口中启动 Java 对话框可能是完全不可能的。
但是,如果您不介意屏幕保护程序和原生屏幕保护程序之间存在细微的不一致,您可能无需这样做就可以侥幸逃脱。您可以让预览模式弹出一个带有预览的新窗口,并让设置模式同样在新窗口中弹出其对话框。并且全屏模式无需调整即可正常工作。
【讨论】: