将.jar文件固定到Windows 7中的任务栏

时间:2014-11-22 03:00:24

标签: java c# windows-7 taskbar

我的问题是已经回答的另一个问题的扩展,https://superuser.com/questions/257467/windows-7-how-to-pin-a-jar-to-the-taskbar

有没有办法将jar固定到任务栏,并将jar生成的窗口注册为不同的进程,从而在任务栏中创建一个不同的图标?因为现在,使用上述问题的答案中列出的任何方法,您最终得到一个可以固定的快捷方式。但它只是一个捷径,而不仅仅是程序本身。我愿意在这一点上尝试任何事情,因为它开始变得非常麻烦。它不仅看起来不专业,而且耗尽了不必要的屏幕空间。我知道有人会问我还尝试了什么,这里有一些代码我尝试在c#中运行以启动jar,但当然,它做同样的事情,将新进程注册为一个新进程。 (应该想到一个通过。)

string strCmdText;
strCmdText = "-jar ImgurDownloader.jar";
Process process = new Process();
process.StartInfo.Arguments = strCmdText;
process.StartInfo.FileName = "javaw";
process.StartInfo.UseShellExecute = false;
process.Start();

所以我试过这个:

string strCmdText;
strCmdText = "-jar ImgurDownloader.jar";
Process process = Process.GetCurrentProcess();
process.StartInfo.Arguments = strCmdText;
process.StartInfo.FileName = "javaw";
process.StartInfo.UseShellExecute = false;
process.Start();

然而,即使我尝试替换当前进程,它也会作为一个新进程出现,因此在任务栏中出现第二个图标。请原谅我可能的短语,几周后沮丧情绪开始显现。

编辑:还尝试使用JNA库设置UAMID(用户应用程序模型ID)来访问shel32.dll的功能。以下是jar中的代码

public static void setCurrentProcessExplicitAppUserModelID(final String appID) {
    if (SetCurrentProcessExplicitAppUserModelID(new WString(appID)).longValue() != 0)
        throw new RuntimeException("unable to set current process explicit AppUserModelID to: " + appID);
}

public static String getCurrentProcessExplicitAppUserModelID() {
    final PointerByReference r = new PointerByReference();

    if (GetCurrentProcessExplicitAppUserModelID(r).longValue() == 0) {
        final Pointer p = r.getValue();

        return p.getString(0, true); // here we leak native memory by
                                        // lazyness
    }
    return "N/A";
}

private static native NativeLong GetCurrentProcessExplicitAppUserModelID(PointerByReference appID);

private static native NativeLong SetCurrentProcessExplicitAppUserModelID(WString appID);

static {
    Native.register("shell32");
}

然后只需调用set方法。但是,使用get方法进行测试

注意:getCurrentProcessExplicitAppUserModelID是一种惰性方法,如果使用的话会在以后解除。

然后在C#Wrapper中,

    [DllImport("shell32.dll")]
    public static extern int SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID);

    static void Main()
    {
        int der = SetCurrentProcessExplicitAppUserModelID("MAndWorks.ImgurDownloader.ImgurDownloader.2.0.0.0");
        string strCmdText;
        Console.WriteLine(der);
        strCmdText = "-jar ImgurDownloader.jar";
        Process process = new Process();
        process.StartInfo.Arguments = strCmdText;
        process.StartInfo.FileName = "javaw";
        process.StartInfo.UseShellExecute = false;
        process.Start();
        process.WaitForExit();
        Console.WriteLine("AWFURA");
    }

0 个答案:

没有答案