void IContextMenu.InvokeCommand(IntPtr pici)
        {
            if (fileNames.Count == 1)
                if (Directory.Exists(fileNames[0]))
                    GitCommands.Settings.WorkingDir = fileNames[0];

            if (string.IsNullOrEmpty(GitCommands.Settings.WorkingDir) && fileNames.Count > 0)
                GitCommands.Settings.WorkingDir = fileNames[0].Substring(0, fileNames[0].LastIndexOf('\\'));

            if (string.IsNullOrEmpty(GitCommands.Settings.WorkingDir))
                GitCommands.Settings.WorkingDir = Directory.GetCurrentDirectory();

            try
            {
                Type typINVOKECOMMANDINFO = Type.GetType("ShellExt.INVOKECOMMANDINFO");
                INVOKECOMMANDINFO ici = (INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, typINVOKECOMMANDINFO);
                switch (ici.verb-1)
                {
                    case 0://Add file
                        {
                            FormAddFiles form = new FormAddFiles();
                            form.Show();

                            break;
                        }
                    case 1://Branch
                        {
                            FormBranch form = new FormBranch();
                            form.Show();
                            break;
                        }
                    case 2://Browse
                        {
                            FormBrowse form = new FormBrowse();
                            form.Show();
                            break;
                        }
                    case 3://Checkout
                        {
                            FormCheckout form = new FormCheckout();
                            form.Show();
                            break;
                        }
                    case 4://Clone
                        {
                            FormClone form = new FormClone();
                            form.Show();
                            break;
                        }
                    case 5://Commit
                        {
                            FormCommit form = new FormCommit();
                            form.Show();
                            break;
                        }
                    case 6://Diff
                        {
                            FormDiff form = new FormDiff();
                            form.Show();
                            break;
                        }
                    case 7://Init
                        {
                            GitCommands.Init cmd = new GitCommands.Init(new GitCommands.InitDto());
                            cmd.Execute();
                            MessageBox.Show(cmd.Dto.Result);
                            break;
                        }
                    case 8://File history
                        {
                            if (fileNames.Count > 0)
                            {
                                FormFileHistory form = new FormFileHistory(fileNames[0]);
                                form.Show();
                            }
                            break;
                        }
                    case 9://ViewPatch
                        {
                            ViewPatch patchapply = new ViewPatch();
                            patchapply.Show();
                            break;
                        }
                    case 10://MergePatch
                        {
                            MergePatch form = new MergePatch();
                            form.Show();
                            break;
                        }
                    case 11://Push
                        {
                            FormPush form = new FormPush();
                            form.Show();
                            break;
                        }
                    case 12://Pull
                        {
                            FormPull form = new FormPull();
                            form.Show();
                            break;
                        }
                    case 13://Bash
                        {
                            GitCommands.GitCommands.RunBash();
                            break;
                        }
                    case 14://Gui
                        {
                            GitCommands.GitCommands.RunGui();
                            break;
                        }
                    default:
                        break;

                }

            }
            catch(Exception exe)
            {
                EventLog.WriteEntry("FileHashShell", exe.ToString());
            }

            //fileNames
        }
        public void StartCommitDialog(Action<FormCommit> refresh, Action finish = null, bool alwaysInTaskbar = true, IWin32Window owner = null, bool showWhenNoChanges = false, bool blocking = false)
        {
            if (RequiresValidWorkingDir(owner))
                if (!InvokeEvent(owner, PreCommit))
                    refresh(null);
                else
                {
                    var form = new FormCommit();
                    form.ShowInTaskbar |= alwaysInTaskbar;

                    Action Committed = () =>
                    {
                        if (form.NeedRefresh && refresh != null)
                        {
                            refresh(form);
                            form.NeedRefresh = false;
                        }
                    };
                    form.Committed += Committed;
                    form.FormClosed += (s, e) =>
                    {
                        try
                        {
                            InvokeEvent(owner, PostCommit);
                        }
                        finally
                        {
                            try
                            {
                                Committed();
                            }
                            finally
                            {
                                if (finish != null)
                                    finish();
                            }
                        }
                    };

                    if (showWhenNoChanges)
                        form.ShowWhenChanges(owner, blocking);
                    else if (blocking)
                        form.ShowDialog(owner);
                    else
                        form.Show();
                }
        }