Модератор Райан предложил несколько подходов на 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);
}