Java中的Windows 7任务栏进度条

我想知道是否有可能使任务栏上显示的进度条像Windows资源pipe理器一样,当有文件操作正在进行?

我看到很多例子,但都涉及C#。

SWT不会削减它。

进度条显示在任务栏上

这是现在可以使用SWT请查看代码示例:
org.eclipse.swt.snippets.Snippet336

Java中没有这样的标准工具。

因此,您需要直接与Windows沟通才能做到这一点。 所以你需要找到正确的Windows例程,并使用JNA(可能是最简单的)来调用该例程。 我不知道谁已经做到这一点的供应商或项目。


编辑:看来, http : //code.google.com/p/nativelibs4java/项目可以做你想做的。

有一个Java库为Java提供了新的Windows 7功能。 它被称为Strix Code的J7Goodies 。 它可以让你显示任务栏进度条,做更多。

这个例子将完成这项工作:

任务栏:
在这里输入图像说明

码:

import org.bridj.Platform; import org.bridj.Pointer; import org.bridj.cpp.com.COMRuntime; import org.bridj.cpp.com.shell.ITaskbarList3; import org.bridj.jawt.JAWTUtils; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.Changelistner; import java.awt.event.ActionEvent; import java.awt.event.Actionlistner; public class TaskBarListDemo extends JFrame implements Actionlistner, Changelistner { private ITaskbarList3 list; private JSlider slider; private Pointer<?> hwnd; private TaskBarListDemo() throws ClassNotFoundException { super("TaskbarList Demo (" + (Platform.is64Bits() ? "64 bits" : "32 bits") + ")"); list = COMRuntime.newInstance(ITaskbarList3.class); getContentPane().add("Center", new JLabel("Hello Native Windows 7 World !")); Box box = Box.createVerticalBox(); int min = 0; int max = 300; int val = (min + max / 2); slider = new JSlider(min, max, val); slider.addChangelistner(this); box.add(slider); ButtonGroup group = new ButtonGroup(); for (ITaskbarList3.TbpFlag state : ITaskbarList3.TbpFlag.values()) { JRadioButton cb = new JRadioButton(state.name()); group.add(cb); cb.putClientProperty(ITaskbarList3.TbpFlag.class, state); cb.setSelected(state == ITaskbarList3.TbpFlag.TBPF_NORMAL); cb.addActionlistner(this); box.add(cb); } getContentPane().add("South", box); } @Override protected void finalize() throws Throwable { super.finalize(); list.Release(); } public void setVisible(boolean visible) { super.setVisible(visible); long hwndVal = JAWTUtils.getNativePeerHandle(this); hwnd = Pointer.pointerToAddress(hwndVal); list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); } @Override public void stateChanged(ChangeEvent actionEvent) { list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); } @Override public void actionPerformed(ActionEvent actionEvent) { JRadioButton button = ((JRadioButton) actionEvent.getSource()); if (button.isSelected()) { ITaskbarList3.TbpFlag flag = (ITaskbarList3.TbpFlag) button.getClientProperty(ITaskbarList3.TbpFlag.class); list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); list.SetProgressState((Pointer) hwnd, flag); } } public static void main(String[] arguments) throws Exception { TaskBarListDemo f = new TaskBarListDemo(); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } } 

Maven依赖:

 <dependencies> <dependency> <groupId>com.nativelibs4java</groupId> <artifactId>bridj</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>LATEST</version> </dependency> </dependencies> 

Windows通过COM公开这个。 我相信一个“扁平的DLL”调用对你来说会更容易,但是如果你能到达COM,你可以做到这一点。 COM接口是ITaskbarList3(也有一个ITaskbarList4,您可以使用它继承它。) http://msdn.microsoft.com/en-us/library/dd391692 (VS.85) .aspx文档。 SetProgressState和SetProgressValue是你想要调用的方法。 状态正常(绿色),暂停(黄色),错误(红色),不确定(绿色)和无。 在MSDN页面上,一些社区的人添加了从VB和C#中调用这个COM组件的细节 – 这可能会帮助您找出Java所需的安装和拆卸。