Java中的Windows 7任务栏进度条

Java中的Windows 7任务栏进度条,java,windows,windows-7,Java,Windows,Windows 7,我想知道当文件操作正在进行时,是否可以像Windows资源管理器那样在任务栏上显示进度条 我看到了很多例子,但都涉及C SWT不会切断它 Java中还没有标准的工具来实现这一点 因此,您需要直接与Windows对话才能做到这一点。因此,您需要找到正确的Windows例程,并使用JNA(可能是最简单的)来调用该例程。我不知道有哪个供应商或项目已经这样做了 编辑:项目可能会执行您想要的操作。Windows通过COM公开此操作。我相信“平面DLL”调用对您来说会更容易,但如果您可以访问COM,您可以

我想知道当文件操作正在进行时,是否可以像Windows资源管理器那样在任务栏上显示进度条

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

SWT不会切断它


Java中还没有标准的工具来实现这一点

因此,您需要直接与Windows对话才能做到这一点。因此,您需要找到正确的Windows例程,并使用JNA(可能是最简单的)来调用该例程。我不知道有哪个供应商或项目已经这样做了



编辑:项目可能会执行您想要的操作。

Windows通过COM公开此操作。我相信“平面DLL”调用对您来说会更容易,但如果您可以访问COM,您可以做到这一点。COM接口是ITaskbarList3(您也可以使用从它继承的ITaskbarList4。)记录它。SetProgressState和SetProgressValue是您要调用的方法。状态为正常(绿色)、暂停(黄色)、错误(红色)、不确定(绿色闪烁)和无。在MSDN页面上,一些社区人士添加了从VB和C#调用此COM组件的详细信息,这可能有助于您了解Java所需的设置和拆卸。

现在可以使用SWT,请查看代码示例:
示例将完成以下工作:

任务栏:

代码:


我发现这个特性包含在Java9中。它是AWT的一部分,使用起来也很简单

下面是一个简短的例子:

import java.awt.Taskbar;
import java.awt.Taskbar.State;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

/**
 * @author fxl
 */
public class TaskbarSample {

    public static void main(String[] args) {

        // JavaDoc:
        // https://docs.oracle.com/javase/9/docs/api/java/awt/Taskbar.html

        // MSDNDoc:
        // https://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx
        if (Taskbar.isTaskbarSupported() == false) {
            return;
        }

        JFrame dialog = new JFrame("Test - 50%");
        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);    


        Taskbar taskbar = Taskbar.getTaskbar();
        taskbar.setWindowProgressState(dialog, State.ERROR);
        taskbar.setWindowProgressValue(dialog, 50);     
    }

}

由于Java9的java.awt.Taskbar只适用于旧的swing框架(他们不知何故忘记了在javafx.stage.stage中实现它),而且com.nativelibs4java bridj不再工作(请参阅),所以我使用JNA 4.1.0实现了一个解决方案

请注意:

  • 依赖于调用内部JavaFXAPI(com.sun.javafx.stage.WindowHelper)——因此它可能会在下一次java更新中中断
  • 它只设置“不确定”的进度状态,但通过一些调整,正常进度状态也应该是可能的
希望这有帮助

ITaskbarList3.java

package example;

import com.sun.jna.platform.win32.Guid.IID;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;

public interface ITaskbarList3 {
    IID IID_ITASKBARLIST3 = new IID("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf"); // from ShObjIdl.h

    int TBPF_NOPROGRESS = 0;
    int TBPF_INDETERMINATE = 0x1;
    int TBPF_NORMAL = 0x2;
    int TBPF_ERROR = 0x4;
    int TBPF_PAUSED = 0x8;

    HRESULT SetProgressState(HWND hwnd, int tbpFlags);
}
package example;

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.platform.win32.COM.COMInvoker;

public final class TaskbarList3 extends COMInvoker implements ITaskbarList3 {

    public TaskbarList3(Pointer pointer) {
        setPointer(pointer);
    }

    @Override
    public HRESULT SetProgressState(HWND hwnd, int tbpFlags) {
        return (HRESULT) this._invokeNativeObject(
                10, // magic number (gathered by trial and error)
                new Object[] { this.getPointer(), hwnd, tbpFlags },
                HRESULT.class);
    }
}
package example;

import com.sun.javafx.stage.WindowHelper;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Guid.CLSID;
import com.sun.jna.platform.win32.Ole32;
import com.sun.jna.platform.win32.W32Errors;
import com.sun.jna.platform.win32.WTypes;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;

import javafx.stage.Stage;

public final class TaskbarPeer {

    public static void setIndeterminateProgress(Stage stage, boolean indeterminate) {
        final var peer = WindowHelper.getPeer(stage);
        final long windowHandle = peer.getRawHandle();

        final var clsid = new CLSID("56FDF344-FD6D-11d0-958A-006097C9A090"); // from ShObjIdl.h
        final var taskbarListPointerRef = new PointerByReference();

        var hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, WTypes.CLSCTX_SERVER,
                ITaskbarList3.IID_ITASKBARLIST3, taskbarListPointerRef);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }

        final TaskbarList3 taskbarList = new TaskbarList3(taskbarListPointerRef.getValue());
        final var hwnd = new HWND(new Pointer(windowHandle));
        final int progressState = indeterminate ? ITaskbarList3.TBPF_INDETERMINATE : ITaskbarList3.TBPF_NOPROGRESS;
        hr = taskbarList.SetProgressState(hwnd, progressState);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }
    }
}
package example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public final class Sample extends Application {

    private boolean indeterminateProgressState = false;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Button btn = new Button("Click me!");

        primaryStage.setScene(new Scene(btn));
        primaryStage.sizeToScene();
        primaryStage.show();

        btn.setOnAction(evt -> {
            indeterminateProgressState = !indeterminateProgressState;
            TaskbarPeer.setIndeterminateProgress(primaryStage, indeterminateProgressState);
        });
    }
}
TaskbarList3.java

package example;

import com.sun.jna.platform.win32.Guid.IID;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;

public interface ITaskbarList3 {
    IID IID_ITASKBARLIST3 = new IID("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf"); // from ShObjIdl.h

    int TBPF_NOPROGRESS = 0;
    int TBPF_INDETERMINATE = 0x1;
    int TBPF_NORMAL = 0x2;
    int TBPF_ERROR = 0x4;
    int TBPF_PAUSED = 0x8;

    HRESULT SetProgressState(HWND hwnd, int tbpFlags);
}
package example;

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.platform.win32.COM.COMInvoker;

public final class TaskbarList3 extends COMInvoker implements ITaskbarList3 {

    public TaskbarList3(Pointer pointer) {
        setPointer(pointer);
    }

    @Override
    public HRESULT SetProgressState(HWND hwnd, int tbpFlags) {
        return (HRESULT) this._invokeNativeObject(
                10, // magic number (gathered by trial and error)
                new Object[] { this.getPointer(), hwnd, tbpFlags },
                HRESULT.class);
    }
}
package example;

import com.sun.javafx.stage.WindowHelper;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Guid.CLSID;
import com.sun.jna.platform.win32.Ole32;
import com.sun.jna.platform.win32.W32Errors;
import com.sun.jna.platform.win32.WTypes;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;

import javafx.stage.Stage;

public final class TaskbarPeer {

    public static void setIndeterminateProgress(Stage stage, boolean indeterminate) {
        final var peer = WindowHelper.getPeer(stage);
        final long windowHandle = peer.getRawHandle();

        final var clsid = new CLSID("56FDF344-FD6D-11d0-958A-006097C9A090"); // from ShObjIdl.h
        final var taskbarListPointerRef = new PointerByReference();

        var hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, WTypes.CLSCTX_SERVER,
                ITaskbarList3.IID_ITASKBARLIST3, taskbarListPointerRef);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }

        final TaskbarList3 taskbarList = new TaskbarList3(taskbarListPointerRef.getValue());
        final var hwnd = new HWND(new Pointer(windowHandle));
        final int progressState = indeterminate ? ITaskbarList3.TBPF_INDETERMINATE : ITaskbarList3.TBPF_NOPROGRESS;
        hr = taskbarList.SetProgressState(hwnd, progressState);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }
    }
}
package example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public final class Sample extends Application {

    private boolean indeterminateProgressState = false;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Button btn = new Button("Click me!");

        primaryStage.setScene(new Scene(btn));
        primaryStage.sizeToScene();
        primaryStage.show();

        btn.setOnAction(evt -> {
            indeterminateProgressState = !indeterminateProgressState;
            TaskbarPeer.setIndeterminateProgress(primaryStage, indeterminateProgressState);
        });
    }
}
TaskbarPeer.java

package example;

import com.sun.jna.platform.win32.Guid.IID;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;

public interface ITaskbarList3 {
    IID IID_ITASKBARLIST3 = new IID("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf"); // from ShObjIdl.h

    int TBPF_NOPROGRESS = 0;
    int TBPF_INDETERMINATE = 0x1;
    int TBPF_NORMAL = 0x2;
    int TBPF_ERROR = 0x4;
    int TBPF_PAUSED = 0x8;

    HRESULT SetProgressState(HWND hwnd, int tbpFlags);
}
package example;

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.platform.win32.COM.COMInvoker;

public final class TaskbarList3 extends COMInvoker implements ITaskbarList3 {

    public TaskbarList3(Pointer pointer) {
        setPointer(pointer);
    }

    @Override
    public HRESULT SetProgressState(HWND hwnd, int tbpFlags) {
        return (HRESULT) this._invokeNativeObject(
                10, // magic number (gathered by trial and error)
                new Object[] { this.getPointer(), hwnd, tbpFlags },
                HRESULT.class);
    }
}
package example;

import com.sun.javafx.stage.WindowHelper;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Guid.CLSID;
import com.sun.jna.platform.win32.Ole32;
import com.sun.jna.platform.win32.W32Errors;
import com.sun.jna.platform.win32.WTypes;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;

import javafx.stage.Stage;

public final class TaskbarPeer {

    public static void setIndeterminateProgress(Stage stage, boolean indeterminate) {
        final var peer = WindowHelper.getPeer(stage);
        final long windowHandle = peer.getRawHandle();

        final var clsid = new CLSID("56FDF344-FD6D-11d0-958A-006097C9A090"); // from ShObjIdl.h
        final var taskbarListPointerRef = new PointerByReference();

        var hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, WTypes.CLSCTX_SERVER,
                ITaskbarList3.IID_ITASKBARLIST3, taskbarListPointerRef);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }

        final TaskbarList3 taskbarList = new TaskbarList3(taskbarListPointerRef.getValue());
        final var hwnd = new HWND(new Pointer(windowHandle));
        final int progressState = indeterminate ? ITaskbarList3.TBPF_INDETERMINATE : ITaskbarList3.TBPF_NOPROGRESS;
        hr = taskbarList.SetProgressState(hwnd, progressState);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }
    }
}
package example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public final class Sample extends Application {

    private boolean indeterminateProgressState = false;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Button btn = new Button("Click me!");

        primaryStage.setScene(new Scene(btn));
        primaryStage.sizeToScene();
        primaryStage.show();

        btn.setOnAction(evt -> {
            indeterminateProgressState = !indeterminateProgressState;
            TaskbarPeer.setIndeterminateProgress(primaryStage, indeterminateProgressState);
        });
    }
}
Sample.java

package example;

import com.sun.jna.platform.win32.Guid.IID;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;

public interface ITaskbarList3 {
    IID IID_ITASKBARLIST3 = new IID("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf"); // from ShObjIdl.h

    int TBPF_NOPROGRESS = 0;
    int TBPF_INDETERMINATE = 0x1;
    int TBPF_NORMAL = 0x2;
    int TBPF_ERROR = 0x4;
    int TBPF_PAUSED = 0x8;

    HRESULT SetProgressState(HWND hwnd, int tbpFlags);
}
package example;

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.platform.win32.COM.COMInvoker;

public final class TaskbarList3 extends COMInvoker implements ITaskbarList3 {

    public TaskbarList3(Pointer pointer) {
        setPointer(pointer);
    }

    @Override
    public HRESULT SetProgressState(HWND hwnd, int tbpFlags) {
        return (HRESULT) this._invokeNativeObject(
                10, // magic number (gathered by trial and error)
                new Object[] { this.getPointer(), hwnd, tbpFlags },
                HRESULT.class);
    }
}
package example;

import com.sun.javafx.stage.WindowHelper;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Guid.CLSID;
import com.sun.jna.platform.win32.Ole32;
import com.sun.jna.platform.win32.W32Errors;
import com.sun.jna.platform.win32.WTypes;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;

import javafx.stage.Stage;

public final class TaskbarPeer {

    public static void setIndeterminateProgress(Stage stage, boolean indeterminate) {
        final var peer = WindowHelper.getPeer(stage);
        final long windowHandle = peer.getRawHandle();

        final var clsid = new CLSID("56FDF344-FD6D-11d0-958A-006097C9A090"); // from ShObjIdl.h
        final var taskbarListPointerRef = new PointerByReference();

        var hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, WTypes.CLSCTX_SERVER,
                ITaskbarList3.IID_ITASKBARLIST3, taskbarListPointerRef);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }

        final TaskbarList3 taskbarList = new TaskbarList3(taskbarListPointerRef.getValue());
        final var hwnd = new HWND(new Pointer(windowHandle));
        final int progressState = indeterminate ? ITaskbarList3.TBPF_INDETERMINATE : ITaskbarList3.TBPF_NOPROGRESS;
        hr = taskbarList.SetProgressState(hwnd, progressState);

        if (W32Errors.FAILED(hr)) {
            throw new RuntimeException("failed with code: " + hr.intValue());
        }
    }
}
package example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public final class Sample extends Application {

    private boolean indeterminateProgressState = false;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Button btn = new Button("Click me!");

        primaryStage.setScene(new Scene(btn));
        primaryStage.sizeToScene();
        primaryStage.show();

        btn.setOnAction(evt -> {
            indeterminateProgressState = !indeterminateProgressState;
            TaskbarPeer.setIndeterminateProgress(primaryStage, indeterminateProgressState);
        });
    }
}

你能为那些没有Windows的人发布一个屏幕截图吗?你想让它像浏览器的进度条一样吗?还是希望它显示在任务栏上。(提示,这两件事中的一件比另一件难多了)。你是如何解决这个问题的?有什么进展吗?好的,我已经安装了javax.comm,但是文档很差。你可能有什么可以提供的吗?对不起,我的Java时代已经过去很久了,如果我知道如何从Java调用COM方法,我已经忘记了。如果您需要关于向这些方法传递什么的文档,当然,我有调用它们的C#代码,所以我知道参数是什么。nativelibs4java似乎使用了COMNo,JNA,它比JNI更容易使用。BridJ(一个nativelibs4java子项目:)确实提供了围绕ITaskbarList3的现成包装,还有一个工作示例:看起来演示链接已经移动到了Hehe,为了记录,演示移动得更远(到github):而且。。。又来了只要最上面的窗口是JFrame,它就可以工作。但是JDialog不起作用。