0

デスクトップアプリケーションがあります。ジャンプリストメニューを追加しました。タスクバーのアイコンを右クリックすると、このメニューがジャンプリストに表示されます。問題は、メニュー項目をクリックしてもアクションが実行されないことです (つまり、アプリがそれをキャッチします)。次のリンクからコードを取得し、それに応じてカスタマイズしました (注: このコード ジャンプリストは、私の PC でも機能しません)。Visual Studio 2013 と Windows 10 を使用しています。

http://www.codeproject.com/Articles/103913/How-to-Create-a-Custom-Jumplist-with-Custom-Events

Program.cs に次のコードを追加しました。

    [STAThread]
    private static void Main()
    {
        bool firstInstance = false;
        Mutex mtx = new Mutex(true, "Jumplist.demo", out firstInstance);

        if (firstInstance)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmSelect());
        }
        else
        {
            // Send argument to running window
            HandleCmdLineArgs();
        }

    }

    public static void HandleCmdLineArgs()
    {
        if (Environment.GetCommandLineArgs().Length > 1)
        {
            switch (Environment.GetCommandLineArgs()[1])
            {
                case "-1":
                    MessageBox.Show(@"-1");
                    break;
                case "-2":
                    MessageBox.Show(@"-2");
                    break;
                case "-3":
                    MessageBox.Show(@"-3");
                    break;
            }
        }
    }
}

Myjumplist クラスには次のコードがあります

public class MYJumpList
{
    private JumpList jumpList;


    /// <summary>
    /// Creating a JumpList for the application
    /// </summary>
    /// <param name="windowHandle"></param>
    public goJumpList(IntPtr windowHandle)
    {
        TaskbarManager.Instance.ApplicationId = "MyJumplist";
        jumpList = JumpList.CreateJumpListForIndividualWindow(TaskbarManager.Instance.ApplicationId, windowHandle);
        jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
        BuildList();
    }

    public void AddToRecent(string destination)
    {
        jumpList.AddToRecent(destination);
        jumpList.Refresh();
    }

    /// <summary>
    /// Builds the Jumplist
    /// </summary>
    private void BuildList()
    {
        JumpListLink jlItem1 = new JumpListLink(Assembly.GetEntryAssembly().Location, "Item1");
        jlItem1.Arguments = "-1";

        JumpListLink jlItem2 = new JumpListLink(Assembly.GetEntryAssembly().Location, "Item2");
        jlItem2.Arguments = "-2";

        JumpListLink jlItem3 = new JumpListLink(Assembly.GetEntryAssembly().Location, "Item3");
        jlItem3.Arguments = "-3";

        jumpList.AddUserTasks(jlItem1);
        jumpList.AddUserTasks(jlItem2);
        jumpList.AddUserTasks(jlItem3);
        jumpList.AddUserTasks(new JumpListSeparator());
        jumpList.Refresh();
    }
}

私のメインフォームコンストラクターには、次のジャンプリストコード行があります

 jumpList = new MyJumpList(this.Handle);

どこが悪いのかわからない。私のアプリケーションでジャンプリストを適用するのを手伝ってください

4

1 に答える 1

0

より多くの調査と苦労を重ねてコードを再配置し、ついに vs 2013 と Windows 10 で動作するジャンプリストを作成することができました。Program.cs では、次のコードを使用しました。

    private static void Main(string[] args)
    {
        if (args.Any())
        {
            try
            {
                var proc = Process.GetCurrentProcess();

                Process[] processes = Process.GetProcessesByName(proc.ProcessName);

                if (processes.Length > 1)
                {
                    //iterate through all running target applications      
                    foreach (Process p in processes)
                    {
                        if (p.Id != proc.Id)
                        {
                            if (args[0] == "Item1")
                                SendMessage(p.MainWindowHandle, Item1Value, IntPtr.Zero, IntPtr.Zero);
                            if (args[0] == "Item2")
                                SendMessage(p.MainWindowHandle, Item2Value, IntPtr.Zero, IntPtr.Zero);
                            if (args[0] == "Item3")
                                SendMessage(p.MainWindowHandle, Item3Value, IntPtr.Zero, IntPtr.Zero);

                            Environment.Exit(0);
                        }
                    }
                }
            }
            catch (Exception)
            {


            }
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        if (args.Any())
        {
            if (args[0] == "Item1") Application.Run(new frmSelect(Item1Value));
            if (args[0] == "Item2") Application.Run(new frmSelect(Item2Value));
            if (args[0] == "Item3") Application.Run(new frmSelect(Item3Value));
        }
        else
        {
            Application.Run(new frmSelect());
        }


    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
    private const int Item1Value = 0xA123;
    private const int Item2Value = 0xA124;
    private const int Item3Value = 0xA125;
}

私のメインフォームの表示方法には次のコードがあります

    private void frmSelect_Shown(object sender, EventArgs e)
    {
        var appPath = Assembly.GetEntryAssembly().Location;
        var jumpList = JumpList.CreateJumpList();
        var category = new JumpListCustomCategory("MyApp");

        category.AddJumpListItems(
            new JumpListLink(appPath, "Item1") {Arguments = "Item1"},
            new JumpListLink(appPath, "Item2") {Arguments = "Item2"},
            new JumpListLink(appPath, "Item3") {Arguments = "Item3"});

        jumpList.AddCustomCategories(category);
        jumpList.Refresh();
    }

メインフォームの WndProc メソッドには次のコードがあります

    protected override void WndProc(ref Message message)
    {
        if (message.Msg == Item1Value) messagebox.show("Item1 Clicked"); // here we can call relevant method
        if (message.Msg == Item2Value) messagebox.show("Item2 Clicked"); // here we can call relevant method
        if (message.Msg == Irem3Value) messagebox.show("Item3 Clicked"); // here we can call relevant method

        base.WndProc(ref message);
    }

アプリケーションでジャンプ リストを使用するために、この簡単な方法を適用できることを願っています。

于 2016-02-09T12:51:04.617 に答える