Как вы не позволяете VS Shell получить приоритет для привязки клавиш / команд в VSPackage ToolWindow? - PullRequest
3 голосов
/ 28 июня 2011

У меня есть пользовательский элемент управления wpf, который принимает жесты ввода для выполнения различных команд. В приведенном ниже примере изображения пользователь может нажать Ctrl + N , чтобы выполнить команду New для создания нового элемента в TreeView.

.

enter image description here

Когда этот пользовательский элемент управления размещен в приложении WPF, пользователь может создать новый элемент, используя Ctrl + N , когда фокус находится на TreeView, и когда пользователь нажимает Ctrl + N когда фокус находится в другом месте приложения, выполняется команда уровня приложения New.

Когда этот пользовательский элемент управления размещен в VSPackage ToolWindow, команда VS 101 level * Shell для создания нового файла выполняется, когда пользователь нажимает Ctrl + N , независимо от фокусировки на * 1021. *.

Как вы препятствуете тому, чтобы VS Shell получил приоритет при привязке клавиш / команд?

1 Ответ

0 голосов
/ 29 июня 2011

Модератор Райан предложил несколько подходов на MSDN . Оболочка VS передает сообщения Winform в ToolWindow, поэтому текущий подход заключается в переопределении PreProcessMessage в ToolWindow, обработке комбинаций клавиш, таких как Ctrl + N , которые сопоставляются командам WPF, и затем переводе этих сообщений и передайте ComponentDispatcher.RaiseThreadMessage.

Этот подход подвержен ошибкам в том смысле, что сопоставление командам WPF может быть не синхронизировано, плюс он не включает возможность выполнения команды WPF. Если у кого-то есть более идеальный подход, пожалуйста, дайте мне знать, или, если я его найду, опубликую.

Возможно, у элемента управления WPF есть способ передать обратно, была ли команда выполнена, и только в том случае, если команда была выполнена, сообщение будет обработано. Тогда всего этого картографического бизнеса можно было избежать.

    private bool isControlKeyDepressed = false;
    private bool isShifKeyDepressed = false;
    private bool isOtherKeyDepressed = false;
    private bool isCommandCombinationDepressed = false;

    protected override bool PreProcessMessage(ref Message msg)
    {
        // trap keyboard messages if window has focus
        if (msg.Msg == 256)
        {
            if (msg.WParam == (IntPtr)17)
            {
                isControlKeyDepressed = true;
                isOtherKeyDepressed = false;
            }
            else if (msg.WParam == (IntPtr)16)
            {
                isShifKeyDepressed = true;
                isOtherKeyDepressed = false;
            }
            else
            {
                if (isOtherKeyDepressed == true)
                {
                    isControlKeyDepressed = false;
                    isShifKeyDepressed = false;
                }
                isOtherKeyDepressed = true;
                if (isControlKeyDepressed == true)
                {
                    if (isShifKeyDepressed == true)
                    {
                        switch (msg.WParam.ToInt64())
                        {
                            case 65: // Ctrl+Shift+A command
                            case 67: // Ctrl+Shift+C command
                            case 78: // Ctrl+Shift+N command
                            case 79: // Ctrl+Shift+O command
                            case 83: // Ctrl+Shift+S command
                            case 85: // Ctrl+Shift+U command
                            case 88: // Ctrl+Shift+X command
                                isCommandCombinationDepressed = true;
                                break;
                            default:
                                isCommandCombinationDepressed = false;
                                break;
                        }
                    }
                    else
                    {
                        switch (msg.WParam.ToInt64())
                        {
                            case 69: // Ctrl+E command
                            case 78: // Ctrl+N command
                            case 79: // Ctrl+O command
                            case 83: // Ctrl+S command
                                isCommandCombinationDepressed = true;
                                break;
                            default:
                                isCommandCombinationDepressed = false;
                                break;
                        }
                    }
                }
                else
                {
                    isCommandCombinationDepressed = false;
                }
            }

            if (isCommandCombinationDepressed == true)
            {
                // send translated message via component dispatcher
                MSG dispatchMsg = new MSG();
                dispatchMsg.hwnd = msg.HWnd;
                dispatchMsg.lParam = msg.LParam;
                dispatchMsg.wParam = msg.WParam;
                dispatchMsg.message = msg.Msg;
                ComponentDispatcher.RaiseThreadMessage(ref dispatchMsg);
                msg.Result = (IntPtr)1;
                return true;
            }
        }
        return base.PreProcessMessage(ref msg);
    }
...